Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вывод спрайтов как одного [Delphi, Windows]


Страницы:   1 2

mozg ©   (2004-10-10 11:53:00) 

У меня генерится лабиринт, где каждый сегмент стены – отдельный класс, отдельный спрайт. Получается ооочень медленно…fpsа0
Как можно ускорить работу в таком случае?
Можно ли сначало сформировать один большой спрайт – лабиринт, и только потом его вывести на экран?

Delphi6, DelphiX


Paravoz   (2004-10-27 04:17:00) [1]

2 Mozg:


> железо на уровне у меня:
> intal pent 4 2600 HT
> GF4 mx440 128


Фиговая видюха - ты GF4 Ti не пробовал


A22   (2004-10-21 13:25:00) [2]

Граждане, попробуйте выводить спрайты через Direct3D, для всех спрайтов, имеющих общую текстуру, формируя 1 буфер вершин, и нормальная будет скорость.. а заодно и прозрачность и повороты и что хотите..


mozg   (2004-10-12 06:51:00) [3]

>>>Почему не Int64? :)

:-))) Да я уж подумывал об Extended :-)


Servelat   (2004-10-11 21:54:00) [4]

2 Ландграф Павел ©
Согласен, без обид :-) .
2 mozg

> поэтому взял по максимуму

Почему не Int64? :) .


mozg   (2004-10-11 21:48:00) [5]

to Servelat
Я пока просто мимоходом глянул...85 ФПС стабильно! Круто!
насчет "? "byte" не достаточно? :) тут даже "boolean" хватит", просто там еще другие элементы возможно будут, я пока не знаю, поэтому взял по максимуму :-) но byte действительно хватит. но пока меня это не беспокоит :-) в азах бы разобраться, а уж оптимизация - дело последнее...хотя почему у меня 0 ФПС выдает при моем подходе, а у тебя 45....странно это.

за исправления и подробные объяснения спасибо огромное!


mozg   (2004-10-11 21:30:00) [6]

железо на уровне у меня:
intal pent 4 2600 HT
GF4 mx440 128
итд..короче не в железе дело, игры на ура скачут :-)


Ландграф Павел   (2004-10-11 21:28:00) [7]

Servelat>не охото спорить=) каждый при своем мнении! я всегда забываю про уважении чужого мнения... ведь скока раз зарекался не спорить, извини! в ламеризме не обвиняю, просто меня убила издевательская фраза с твоей стороны "За экраном монитора что-либо отрисовать очень проблематично...", просто я так понял что ты действительно думал что если вывести картинку 800х600 пикселей при разрешении 800х600, и 1600х1200 пикселей, но с этим же разрешением 800х600 (то есть мы увидим тока 800х600, края будут за экраном), то fps будут те же... а это извините ламеризм, согласен?


Servelat   (2004-10-11 20:25:00) [8]

2 mozg
Тот вариант, который я скачал по ссылке у меня работал с 38-40 FPS'ами. Я тебе по мылу послал свой вариант, немного мелких исправлений внес, теперь FPS 84-85, по сравнению со старым вариантом FPS вырос в 2 раза. Однако почему у тебя FPS 0-1 был я не знаю, может железо старое очень?


mozg   (2004-10-11 19:25:00) [9]

>>>помещается ли у него на один экран весь его лабиринт
помещается. но возможно надо будет сделать так, чтобы лабиринт был больше.

www.uic.nnov.ru/~koav34/Labirint.rar

Delphi6, Delphix


Servelat   (2004-10-11 19:01:00) [10]


> Ну ты вообще меня удивляешь... думаешь зачем вседелают
> карты по 32x32?

Честно скажу, я являюсь частью ВСЕХ, и имею право на собственное мнение. Если под 32x32 ты имел в виду размер тайла - то я видел кучи примеров, где тайлы других размеров. Если ты имеешь в виду количество тайлов по горизонтали и вертикали, то опять же тучи примеров с другими размерами (хотя тут возможна оптимизация с помощью сдвигов для более быстрой работы с массивом). Но как эта фраза связана со всей остальной частью твоего поста я не понимаю.

> ДА ЗАТЕМ ЧТОБЫ не отрисовывать то, чего не видно!

Как это помогает не отрисовывать что-либо я не вижу.
Да, при больших размерах карты, которая еще и изменяется часто, создавать поверхность с отрендеренной на неё картой смысла не имеет, легче отрисовывать только нужный квадрат тайлов. Однако если карта статичная (у автора ветки лабиринт вообще не изменяется) и нужно быстродействие, то мой способ будет предпочтительнее, чем

> все стены в один битмап, а выводить паттернами!

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

> видимо ты про поверхности ничего даже и не слыхивал, а наверное
> думал про процессор рисует прямо на монитор, пофигу ему
> на видеокарту, на directx, просто раз и все! А что не попало
> в экран автоматикой не отрисовывается и ресурсы не жрет...
> так?

То что хранится в памяти жрет такой ресурс, как память.
Так как автор ветки не сообщил, помещается ли у него на один экран весь его лабиринт, или нет, то я считал, что помещается. Опять же, не трудно копировать часть поверхности с изображением всего лабиринта на экран, только то, что видно. Обвинения в ламеризме я считаю несостоятельными, я повода на них не давал.
Извиняюсь за офтоп.

2 mozg
Ты ошибку нашел? Если не нашел, то выкладывай куда-нибудь исходник, помогу искать. Удачи.


mozg   (2004-10-11 18:32:00) [11]

>>>как раз в таймер его сувать и надо!
я про то и пишу, что 0,Ю иногда 1 ФПС при таком раскладе... :-(


mog   (2004-10-11 18:31:00) [12]

>>>как раз в таймер его сувать и надо!
я про то и пишу, что 0,Ю иногда 1 ФПС при таком раскладе... :-(


Ландграф Павел   (2004-10-11 18:18:00) [13]

Servelat>За экраном монитора что-либо отрисовать очень проблематично :)
Ну ты вообще меня удивляешь... думаешь зачем все делают карты по 32x32? ДА ЗАТЕМ ЧТОБЫ не отрисовывать то, чего не видно! видимо ты про поверхности ничего даже и не слыхивал, а наверное думал про процессор рисует прямо на монитор, пофигу ему на видеокарту, на directx, просто раз и все! А что не попало в экран автоматикой не отрисовывается и ресурсы не жрет... так?
mozg> хе.. хе.. енто ты при загрузке что-ли один раз отрисовываешь, и все? а каким тада макаром будет все отрисовываться??? как раз в таймер его сувать и надо!


mozg   (2004-10-11 17:10:00) [14]

>>>Надеюсь та процедура вызывается не в таймере? А то находятся умники, которые создание спрайтов в таймер заносят, и спрайты у них плодятся быстрее кроликов...

Нет, процедура генерит спрайты при form.create

>>>Реализовывается так:
IL.Items.Find('wall').Draw(DXDraw1.Surface, i*Width, j*Height, 0);
IL - твой DXImageList.

порпробовал так...елси эту процедуру отрисовки запускать при старте проги, то ФПС много, но на экране ничего :-)
Если заиихнуть ее в таймер (что вообщем-то и должно), то результат как и раньше...

сейчас проверю второй способ.

но кажется мне что где-то таиться совсем банальная ошибка...которую просто по неопытности невижу.


Servelat   (2004-10-11 16:05:00) [15]


> быстрее? а ты подумай что будет если лабиринт больше размера
> экрана... все что за экраном будет отрисовываться...

За экраном монитора что-либо отрисовать очень проблематично :) .
Как ты наверное сам понимаешь, выводить можно и часть картинки, при этом часть большой картинки выводить все равно быстрее, чем кучу маленьких.  В случае отсутствия у кого-либо опыта, этот опыт надо набирать, я же сказал, как сделать быстрее (первоначальная жалоба была на скорость вывода: " Получается ооочень медленно").

2 П7
Ты про что?


П7   (2004-10-11 10:41:00) [16]

И всё-таки это очень странно...


Ландграф Павел   (2004-10-11 08:49:00) [17]

Servelat>быстрее? а ты подумай что будет если лабиринт больше размера экрана... все что за экраном будет отрисовываться... в его случае при отсутствии опыта+Delphix легче все стены в один битмап, а выводить паттернами!


mozg   (2004-10-11 05:35:00) [18]

О! То, что надо. Спасибо за помощь! Вечером во всем разберусь и все заработает.
thanks!


Servelat   (2004-10-10 23:28:00) [19]


> на каждый сегмент стены идет вывод:

Надеюсь та процедура вызывается не в таймере? А то находятся умники, которые создание спрайтов в таймер заносят, и спрайты у них плодятся быстрее кроликов...

> to Ландграф Павел:
> Плохо тебя понял. Сказывается отсутствие опыта в работе
> с DelphiX. Не знаю как в нем реализовать то, что ты написал.
> А решить задачу надо.

Реализовывается так:
IL.Items.Find('wall').Draw(DXDraw1.Surface, i*Width, j*Height, 0);
IL - твой DXImageList.

Но еще быстрее будет, если все сначала на один итем отрисовать, а потом его на экран:

var
 S: TDirectDrawSurface;
 D: TDib;
 Item: TPictureCollectionItem;
 i,j: integer;
begin
 //подготовительные действия
 D:=TDib.Create;

 S:=TDirectDrawSurface.Create(DXDraw1.Surface.DDraw);
 S.SystemMemory:=False;

 //тут указываешь ширину и высоту лабиринта в пикселях
 S.SetSize(ширина, высота);
 S.Fill(0);

 //отрисовка
 for i:=1 to MaxX do
   for j:=1 to MaxY do
     if massive[i,j]=0 then
       with IL.Items.Find('wall') do
         Draw(S, i*Width, j*Height, 0);

 S.AssignTo(D);
 S.Free;

 //сохранение в DXImageList
 Item:=TPictureCollectionItem.Create(IL.Items);
 Item.Name:='labirint';
 Item.SystemMemory:=False;
 Item.Picture.Graphic:=D;
 Item.TransparentColor:=0;
 Item.Transparent:=True;
 Item.Restore;

 D.Free;
end;


Это делаешь один раз после создания массива лабиринта.
В таймере же отрисовка будет выглядеть так:
IL.Find('labirint').Draw(DXDraw.Surface, 0, 0, 0);

В коде предполагается, что в картинках стен не используется черный цвет (он сделан прозрачным для созданного item'а). Если этот цвет используется, то выбери другой цвет прозрачности, и вот в этих строчках вместо "0" поставь его:

S.Fill(0);
...
Item.TransparentColor:=0;

ЗЫ Код писал прям тут, возможны мелкие ошибки/опечатки.


mozg   (2004-10-10 23:09:00) [20]

кстати, вывод без прозрачности.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо