Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Как реализовать графику на 2D движке   Найти похожие ветки 

 
gray_falcon ©   (2007-05-29 15:51) [0]

Как можно осуществить быстрый вывод изображений с удалением фона и изменением размера, их быструю загрузку в ОЗУ, желательно без DirectX? А то мои прошлые "графические движки", если они вообще таковыми являлись, работали со скоростью бешеной черепахи.


 
@!!ex_   (2007-05-29 16:14) [1]

Я пишу на OPenGL, но пишу 3Д.
Для вывода 2Д вполне хватает кэнваса.
Могу пример кинуть.


 
Домик   (2007-05-29 21:29) [2]

> желательно без DirectX?

Думаю, что быструю графику хорошего качества с различными современными спецэффектами (пусть даже и 2д) без участия DirectX или OpenGL вряд ли получится получить. Но можно попробовать GDI (или GDI+?).

> Для вывода 2Д вполне хватает кэнваса.

Только в том случае если ты собираешься выводить графики, или примитивную графику аля прототип игры. Для графики полноценной игры, возможностей канваса не хватит :)


 
homm ©   (2007-05-29 21:37) [3]

> [2] Домик

Вот GDI+ как раз использовать не нужно, ничего хорошего не выйдет  плане производительности.

Лучше на основе какого-нибудь FastDIB млм подобных.


 
@!!ex_   (2007-05-30 08:12) [4]

> Только в том случае если ты собираешься выводить графики,
> или примитивную графику аля прототип игры. Для графики
> полноценной игры, возможностей канваса не хватит :)

Вполне хватает.
НАсыщенная сцена с нормальным разрешщением легко рисуется.
Конечно не стандартными средствами VCL.

> homm,
как раз в этом лучше разбирается.


 
Домик   (2007-05-30 12:05) [5]

> homm ©   (29.05.07 21:37) [3]

Да, я знаю. Я сразу написал, что без DirectX или OpenGL быструю и качественную графику не сделать. Но если человеку очень хочеца без DrectX... Пусть пробует.

> НАсыщенная сцена с нормальным разрешщением легко рисуется.

Я бы не рискнул делать игру, основывая её графическую часть на канвасе :)


 
@!!ex_   (2007-05-30 13:51) [6]

> [5] Домик   (30.05.07 12:05)
> > homm ©   (29.05.07 21:37) [3]
>
> Да, я знаю. Я сразу написал, что без DirectX или OpenGL
> быструю и качественную графику не сделать. Но если человеку
> очень хочеца без DrectX... Пусть пробует.
>
> > НАсыщенная сцена с нормальным разрешщением легко рисуется.
>
> Я бы не рискнул делать игру, основывая её графическую часть
> на канвасе :)

Возможно мы под Канвасом подразумеваем разные вещи. Лично я под Канвасом подразумеваю ручной рендер основанный на стандартных средствах, без вмешательства DX и OGL. Такими средствами был в свое время написан Анрыл и много других хороших игр. ;)


 
Sapersky   (2007-05-30 20:29) [7]

У GDI/софтвера, кроме скорости вывода, есть ещё такая проблема - отсутствие нормального механизма двойной буферизации с переключением страниц (page flipping) и синхронизации с вертикальной развёрткой. Во всяком случае автор SpriteUtils, который в этом направлении копал долго и упорно, в конечном итоге пришёл к использованию DirectDraw. Правда, у него игра была весьма специфичная, с быстрым скроллингом карты, а если скроллинга нет или он относительно неторопливый, то, наверное, сойдёт и BitBlt.

По скорости - да, если руки прямые, можно сделать быстро, но догнать и тем более перегнать OpenGL/Direct3D вряд ли получится (на нормальной машине, у которой мощность видеокарты пропорциональна мощности CPU и видеокарта, само собой, поддерживает 3D-ускорение).
Даже интегрированное видео как минимум не проигрывает CPU. Есть у меня тест на блендинг (полупрозрачность) - exe, 30 кб:
http://slil.ru/24440980
Видеокарта (именно интегрированная, i915) быстрее Cel 2.8 в 2-3 раза.


 
@!!ex ©   (2007-05-30 20:36) [8]

> По скорости - да, если руки прямые, можно сделать быстро,
> но догнать и тем более перегнать OpenGL/Direct3D вряд ли
> получится (на нормальной машине, у которой мощность видеокарты
> пропорциональна мощности CPU и видеокарта, само собой, поддерживает
> 3D-ускорение).
> Даже интегрированное видео как минимум не проигрывает CPU.
> Есть у меня тест на блендинг (полупрозрачность) - exe, 30
> кб:

Да никто не спорит.
Для этого и создавались эти АПИ, для этого и видеокарты постоянно обновляются.


 
homm ©   (2007-05-30 22:18) [9]

> Есть у меня тест на блендинг (полупрозрачность) - exe, 30 кб:
> http://slil.ru/24440980

Это что еще за троян? Зачем она в сеть просится?


 
homm ©   (2007-05-30 22:53) [10]

Кстати, нельзя ли гденить еще исходчег выложить? Охото глянуть, как там софтвере сделан.


 
gray_falcon ©   (2007-05-31 00:13) [11]

От слов к делу! Покажите или исходничек без DX, ну или даже с DX (как бы мне сейчас не хотелось его использовать).
И еще, я пока не разрабатываю игру графикой похлеще чем в Готике 3 или Думе 3, и с поддержки DirectX 10, поэтому мне особо не нужны на этом движке яркие спецэффекты.
Это не отрицание DX, просто хотел провести разминку перед тем как писать с помощью него


 
Sapersky   (2007-05-31 02:43) [12]

Охото глянуть, как там софтвере сделан.

Additive - FastLIB"овский AddBlend.
Alpha - конвертированный под FastLIB MMXAlphaPut из SpriteUtils.

Кстати, с альфой довольно шустро работает функция GDI AlphaBlend, хотя, говорят, нестабильно в Win9x. Я тестировал на Win2000  - вроде всё нормально, скорость cопоставима с MMXAlphaPut, хотя AlphaBlend в некотором смысле "мухлюет" - использует premultiplied alpha, т.е. нужно заранее умножить на alpha пиксели исходной картинки.

От слов к делу! Покажите или исходничек без DX

Если по этому поводу:
http://delphimaster.net/view/8-1180354902/
то PixelFormat пробовал?
Я у себя проверял - действительно быстрее, но на разных ОС и драйверах оно может быть по-разному, поэтому выразился осторожно.
Теоретическая основа такая:
32 бита:
1) мелкософт умудряется писать жутко кривой код для обработки 24-битных картинок (притом что именно этот формат до XP включительно является стандартом). Проверено также со StretchBlt, и не только мной - 32-битные битмапы значительно быстрее.
2) на некоторых картах копирование на экран быстрее если формат битмапа = формату рабочего стола, а обычно стоит именно 32 бита.
pfDevice:
при выводе таких битмапов может использоваться (и обычно используется на NT-семействе, хотя зависит от драйвера) аппаратное ускорение, но только для простых операций вроде BitBlt и TransparentBlt (StretchBlt не ускоряется). Доступ к пикселям (Pixels, Scanlines) такого битмапа получить нельзя, точнее можно, но очень медленно.

Если так уж надо исходничек примера с блендингом - завтра, может быть... то есть, гм, сегодня, но днём.


 
cyborg ©   (2007-05-31 09:35) [13]

> [11] gray_falcon ©   (31.05.07 00:13)

Попробуй http://miniforum.ru/show.php?&forum=8&theme=136
Там используется директ икс, но с ним ты не будешь иметь дело напрямую.


 
XProger ©   (2007-05-31 11:33) [14]

http://timeforkill.mirgames.ru/img/scr/5.jpg - OpenGL
Мне страшно представить сколько нужно угрохать сил и нервов, чтобы заставить даже это работать на GDI... про FPS я, как человек культурный, промолчу )


 
gray_falcon ©   (2007-05-31 20:44) [15]


> PixelFormat пробовал?

еще как пробовал. Все идет ОК, теперь е*... мучаюсь со способами хранения групп изображений для последующего вывода.
А вообще я взял себе за образец движок игры "Alien Shooter" (играл кто-нибудь? Он мне больше нравится чем некоторые 3D шутеры). По моему это хороший ориентир. Ну дак вот там изображения хранятся в файлах *.vid и выводятся один за одним в зависимости от угла поворота. Щас разрабатываю эту структуру хранения различных видов объекта.


 
XProger ©   (2007-05-31 21:13) [16]

gray_falcon, ядро у Alien Shooter основано на DirectX. И даже такой скорости тебе никакой GDI движок не даст )


 
@!!ex ©   (2007-05-31 21:15) [17]

Хм. Я навино полгалал, что Алиен Шутер - смесь 3Д и 2Д. Я ошибался? :)) Надо будет на dtf спросить.


 
Yashin ©   (2007-05-31 21:50) [18]

сейчас вышел Alien Shooter полный 3D !


 
homm ©   (2007-06-01 09:14) [19]

> И даже такой скорости тебе никакой GDI движок не даст )

Что значит «И даже такой» ? :) Он у меня 300-500 fps выдет :)


 
Домик   (2007-06-01 13:20) [20]

> сейчас вышел Alien Shooter полный 3D !

Если имеется в виду Alien Shooter 2, то спешу вас огорчить, там все 2D.


 
XProger ©   (2007-06-01 19:19) [21]

homm, сомневаюсь что твой GDI движок способен выводить столько контента с достойной скоростью на таком разрешении.


 
@!!ex ©   (2007-06-01 20:12) [22]

> XProger ©   (01.06.07 19:19)

Не, никто не спорит, что CPU+GPU быстрее, чем CPU. Но все же ИМХО не стоит сбрасывать все это сосчетов.


 
homm ©   (2007-06-01 21:16) [23]

> homm, сомневаюсь что твой GDI движок способен выводить столько
> контента с достойной скоростью на таком разрешении.

Да я спорю что-ли :), я про то что Alien Shooter выдает фэпээсов совсем не «и даже» :))


 
homm ©   (2007-06-01 22:31) [24]

Кстати, XProger (и не только), помнишь кто-то спрашивал, как можно наиболее оптимально заполнить поле 640х480 квадратами 8х8? Я вылизал алгоритм  до самого предела. Если интересно, кто-нибудь возметься реализовать такое на апаратном ускорении (каком — без разницы), чисто ради сравнить результаты? Мне почему-то кажеться, что быстрее не может получиться.
Вот что у меня получилось по скорости в полном software: На формирование одного кадра уходит примерно 3,1 МГц, что соответствует примерно 1760/3,1 =566 кадров в секунду! Причем если отключить только одну функцию BitBlt, переносящую результат на экран, получаем примерно 1760/1,6 = 1076 кадров в секунду! Конечно второй показатель практически безполезен, без блитинга в видеопамять.

В обшем вот архив с проектом и демкой (30 Кб)
http://homm86.narod.ru/files/fps.rar


 
XProger ©   (2007-06-01 23:08) [25]

homm, а можешь это сделать разноцветными квадратами с нормальным циклом отрисовки расчитывающим РЕАЛЬНЫЙ фпс в зависимости от кол-ва отрисованных кадров за последнюю секунду? За реализацию на OpenGL в таком случае - возьмусь.


 
homm ©   (2007-06-02 00:04) [26]

Обновил архив. Так и не понял, зачем имеено «разноцветными квадратами», но добавил и патернов, выбирай какой нравиться бльше :)


 
XProger ©   (2007-06-02 02:39) [27]

Меряться так меряться...
http://xproger.mirgames.ru/tmp/test.rar - даёт 860 FPS против твоих 260 :)
твой ход...


 
Vga ©   (2007-06-02 07:37) [28]

~1200FPS на демке homm, ~1000FPS на демке XProger :)


 
homm ©   (2007-06-02 09:48) [29]

Да уж, похоже вера в аппаратное ускорение вернулась :))
У меня 1500 получилось, в 3 раза больше :)


> ~1200FPS на демке homm, ~1000FPS на демке XProger :)
Что еше можно было ожидать от VGA ;) Наверное коре 2 дури и видео встроенное.


 
@!!ex ©   (2007-06-02 10:24) [30]

170 против 340.
Правда стоит заметить что запускалось все при напрочь загруженном проце и пустой карте...


> [29] homm ©   (02.06.07 09:48)

Еще раз убеждаемся, что все зависит только от оборудования.


 
Vga ©   (2007-06-02 10:41) [31]

Core 2 Duo E6300, ATI Radeon X1950Pro - мягко говоря не чета встроенному.


 
homm ©   (2007-06-02 10:56) [32]

> [31] Vga

тогда не знаю, почему Прогеровская демка так «тормозила» :) У меня 7600GT, как уже говорил 1500fps.


 
Vga ©   (2007-06-02 10:59) [33]

Одна из причин - на АТИ под винду опенгл сделан через жопу, увы. На маках говорят дрова лучше, но то маки и там дырекса нету


 
gray_falcon ©   (2007-06-02 14:43) [34]

Объясните мне, или я че не допонял, мне зачем выводить изображение 1000 раз в секунду, когда у меня CRT с частотой обновления экрана в 100 Гц. Мне вполне этой 100 хватит, такую частоту 2D движок на канвасе точно потянет.


 
homm ©   (2007-06-02 15:10) [35]

> Объясните мне, или я че не допонял, мне зачем выводить изображение 1000 раз в секунду

Нужно пытаться минимизировать время построения любого объекта. Представь группу разработчиков. Оди реализует HDR шейдеры, другой модели рисует, третий текстуры, четвертый картой занимаеться. Делают они каждый свое дело, у каждого по 80-100 кадров на тестовый сценах получаеться, а потом все это дело собирают и получаеться не более 20. Вроде-бы и так все шустро было, а игра получилась тормознутая.


 
XProger ©   (2007-06-02 15:38) [36]

gray_falcon, высокая скорость отрисовки - показатель скорости работы софта и железа. Больше частоты развёртки в играх естественно не нужна, но Canvas, так называемый, в тех же играх этого выдать не способен... стоит применить пару поворотов с блендингом (которые естестенно тебе придётся реализовывать самому вручную) и FPS упадёт до единиц.


 
homm ©   (2007-06-02 16:55) [37]

> [27] XProger ©   (02.06.07 02:39)
> твой ход...

Ну давай, попробую :))
http://homm86.narod.ru/files/test.rar

Правда это уже на основе твоей демы, но все равно, я еше 230 кадров из нее выжал :P


 
XProger ©   (2007-06-02 18:17) [38]

homm, а у меня почему-то проигрывает на 150 фпс... я так понимаю ты попытался выйграть на облегчении работы CPU...
В отрисовке здесь работает GPU, так что я спокойно могу крутить циклы до 100000 сложений в рендере и FPS даже не просядет )


 
CloseGL   (2007-06-02 18:23) [39]

Ну не знаю как у вас, а у меня 1376 - 1378 FPS =)


 
homm ©   (2007-06-02 18:26) [40]

> а у меня почему-то проигрывает на 150 фпс...

«Этого не может быть, потому что этого не может быть» ©
Очень интересный результат. :) Я бы понял, если бы 8-й жифорс сравновали, там что-то говорили о переводе логики из режима работы с плавающей точкой в целочисленый, ито это для шейдеров, а так вообще не понятно.
Может кто еще попробует и скажет, какой вариант выдает сколько фэпээсов?

ЗЫ XProger, может что-нить в фоне работает, забыл отключить? У меня даже винамп с диспетчером задачь напару сотню попугаев съедают.


 
Vga ©   (2007-06-02 19:29) [41]

У меня test[homm] тоже проигрывает test[XProger] на полсотни кадров.
А на G80, AFAIK, основан на скалярных (а не векторных, как раньше) процессорах с плавающей точкой. R600 - на суперскалярных с плавающей точкой, но тоже не векторных.


 
XProger ©   (2007-06-02 19:50) [42]

homm, я сравнивал наши демки по очереди... твоя вроде не запускает вторичных процессов? )


 
Vga ©   (2007-06-02 20:29) [43]

Хех, я тоже переписал демку :) ~1800FPS
http://vgacich.narod.ru/test.7z


 
Vga ©   (2007-06-02 20:32) [44]

Мдя. А мож даже и 1900


 
homm ©   (2007-06-02 20:48) [45]

> Vga ©

Может тогда так? :)
procedure Render;
const
 W = 640 div 8;
 H = 480 div 8;
 D = 1/8;
var
 i: Integer;
 X, Y: Integer;
begin
 for i:=0 to 4799 do
 begin
   TCB[4*i].X:=Random(8)*D;
   TCB[4*i].Y:=Random(8)*D;
   TCB[4*i+1].X:=TCB[4*i].X+D;
   TCB[4*i+1].Y:=TCB[4*i].Y;
   TCB[4*i+2].X:=TCB[4*i].X+D;
   TCB[4*i+2].Y:=TCB[4*i].Y+D;
   TCB[4*i+3].X:=TCB[4*i].X;
   TCB[4*i+3].Y:=TCB[4*i].Y+D;
 end;
 glTexCoordPointer(2, GL_FLOAT, 0, @TCB[0]);
 glEnableClientState(GL_VERTEX_ARRAY);
 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 glDrawArrays(GL_QUADS, 0, 19200);
 glDisableClientState(GL_VERTEX_ARRAY);
 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
end;


 
Vga ©   (2007-06-02 20:49) [46]

Кстати да :D


 
homm ©   (2007-06-02 20:50) [47]

У меня как раз 1900 и вышло, а без этого исправления писовался ккой-то бред и было не более 1300.


 
Vga ©   (2007-06-02 20:54) [48]

Тото картинка странная. И ФПС теперь 2100


 
homm ©   (2007-06-02 20:56) [49]

> Тото картинка странная. И ФПС теперь 2100

Ну вот, а автор той темы, с которой все и началось хотел все-то 30 :D


 
Vga ©   (2007-06-02 21:07) [50]

Залил с фиксом homm"а, http://vgacich.narod.ru/test_fix.7z


 
homm ©   (2007-06-02 21:13) [51]

Ну и победные для моей системы 2 килогерца, если заменить
glVertexPointer(2, GL_FLOAT, 0, @VB[0]);
на
glVertexPointer(2, GL_SHORT, 0, @VB[0]);

Ура! :)

Спасибо, друзья, узнал сегодня много интересного, все-же грфика не основное мое занятие :)


 
Vga ©   (2007-06-02 21:28) [52]

А с GLint? По идее, в 32бит системе должно быть быстрее, но требуется больше данных гонять по шине


 
Vga ©   (2007-06-02 21:31) [53]

И кстати, у тебя что за система? Видяха, ее шина, проц?


 
homm ©   (2007-06-02 21:38) [54]

> А с GLint?

Посредине между GL_FLOAT и GL_SHORT.


> В отрисовке здесь работает GPU, так что я спокойно могу
> крутить циклы до 100000 сложений в рендере и FPS даже не
> просядет )

Ну 100000 это конечно ты загнул, а вот 10000 да, работает практически без ущерба для основной сцены :)


 
homm ©   (2007-06-02 21:40) [55]

Sempron2800+ (разогнан с 1600 до 1760) память ДДР-2 около 600 что-то. PCI-E GF-7600GT.


 
homm ©   (2007-06-02 21:40) [56]

> память ДДР-2 около 600

это частота :)


 
Vga ©   (2007-06-02 21:41) [57]

Гм. Видимо влияет пропускная способность шин памяти и возможно карты. И проц видимо быстрее работает с целочисленной математикой.


 
homm ©   (2007-06-02 23:00) [58]

http://opengl.gamedev.ru/articles/?id=124
Лучше положения вершин, нормали, текс. координаты и др. атрибуты хранить в 16-битных целых (GL_SHORT) - это не даёт perfomance penalty начиная с Radeon 9200 и GF4Ti, зато существенно экономит память (при этом такие числа обладают гораздо большей точностью, чем half float) и снижает время загрузки геометрии (как с жёсткого диска в оперативную память, так и в буферы в видеопамяти).


 
Vga ©   (2007-06-02 23:46) [59]

Гм. Статью я читал, однако это благополучно забыл :) Но вообще-то, я имел в виду CPU


 
gray_falcon ©   (2007-06-03 00:00) [60]


> Ну вот, а автор той темы, с которой все и началось хотел
> все-то 30 :D


Ладно, считайте что уговорили, BitBlt, как говорится, хорошо, а OGL лучше. Тогда никто не покажет простой пример применения этой библиотеки (или DX) наподобие "загрузил бмп-вывел на экран и все". Желательно если хоть с какимито комментариями. А то с этими экзаменами времени изучать справочники нету.
заранее благодарен :}


 
homm ©   (2007-06-03 00:05) [61]

> > Ну вот, а автор той темы, с которой все и началось хотел все-то 30 :D
> Ладно, считайте что уговорили, BitBlt, как говорится, хорошо, а OGL лучше.

Имлся ввиду другой автор(вроде бы) другой ветки :) Не могу я ее найти что-то :) А вообше, бери за основу как раз ХПрогеровскую демку, движек вполне хорош для маленьких проектов. Тока код движка наверное для D7 был написан, в D5 мне много чего править пришлось )


 
Vga ©   (2007-06-03 01:25) [62]

Пишет XProger вообще-то уже в D10 (если не 11) и планирует обломать более старые дельфи совсем, методом использования новых фич.
Для 2D там AFAIK непосредственно ничего нету, кроме общих инструментов и установки ортографической проекции. В этом плане лучше движок DGLE, хотя он довольно таки кривоват...
А вообще, AFAIK, Asphyre (экс PowerDraw) - вполне таки хороший двухмерный движок.
Если есть API для дельфи, то я слышал, что еще хорош PopCap Framework.

Ну а в качестве примера вполне сойдут исходники соответствующих функций из DGLE (http://dron.mirgames.ru)


 
Sapersky   (2007-06-04 14:41) [63]

За мерянием некими девайсами (которое, каюсь, я же и спровоцировал :)) никто не вспомнил про

http://www.igdc.ru/

Имеется множество игр с исходниками, и на аппаратных, и на софтверных движках. Аппаратных, впрочем, больше, из софтверных могу вспомнить космосим (или это называлось "скроллер", точно не помню) antonn"а и арканоид Imp"а.
+ готовые движки. Помнится, Darthman выкладывал простенький 2D-движок на OGL - DL-FX2, кажется, он назывался.


 
имя   (2007-06-17 15:33) [64]

Удалено модератором


 
имя   (2007-06-17 15:33) [65]

Удалено модератором


 
имя   (2007-06-17 15:33) [66]

Удалено модератором


 
имя   (2007-06-20 23:17) [67]

Удалено модератором


 
имя   (2007-07-25 06:51) [68]

Удалено модератором



Страницы: 1 2 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.65 MB
Время: 0.062 c
2-1267322500
RWolf
2010-02-28 05:01
2010.08.27
TControlBar: как запретить вертикальное перемещение тулбаров


15-1270812348
dars73
2010-04-09 15:25
2010.08.27
Как настроить локализацию


15-1264657678
vajo
2010-01-28 08:47
2010.08.27
Телефон по витой паре.


15-1268602039
Ega23
2010-03-15 00:27
2010.08.27
А давайте задачку порешаем?


2-1269848151
bobby
2010-03-29 11:35
2010.08.27
Относительные пути Windows