![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вывод спрайтов как одного [Delphi, Windows]
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]кстати, вывод без прозрачности.