Форум: "Игры";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
ВнизВывод спрайтов как одного Найти похожие ветки
← →
mozg © (2004-10-10 11:53) [0]У меня генерится лабиринт, где каждый сегмент стены – отдельный класс, отдельный спрайт. Получается ооочень медленно…fpsа0
Как можно ускорить работу в таком случае?
Можно ли сначало сформировать один большой спрайт – лабиринт, и только потом его вывести на экран?
Delphi6, DelphiX
← →
Servelat © (2004-10-10 12:13) [1]
> Можно ли сначало сформировать один большой спрайт – лабиринт
Можно сформировать одну большую картинку (DXImageListItem) с изображением лабиринта (лабиринт же у тебя не слишком часто изменяется), а потом выводить её на экран. Скорость вывода будет явно больше. Однако, тебе нужно хранить массивом или еще как-то где какая стена в лабиринте, чтобы столкновения обрабатывать, не давать ходить сквозь стены.
А что, лабиринт очень большой и состоит из кучи элементов, что все ооочень медленно?
← →
mozg © (2004-10-10 12:29) [2]>>>лабиринт же у тебя не слишком часто изменяется
в прнципе лабиринт совсем не изменяется. Он генериться один раз, как массив из нулей и единиц (0-стена, 1-проход) и по этим данным выводиться на экран.
>>> Однако, тебе нужно хранить массивом или еще как-то где какая стена в лабиринте, чтобы столкновения обрабатывать, не давать ходить сквозь стены.
С этим все в порядке, все работает в массиве.
>>>А что, лабиринт очень большой и состоит из кучи элементов, что все ооочень медленно?
Вообще нет, сам не знаю почему. лабиринт 70 на 50 элементов, где-то половина из них заполнена спрайтами...то есть где-то 1750 спрайтов...эээ, кстати довольно много :-)
>>>Можно сформировать одну большую картинку (DXImageListItem) с изображением лабиринта
Подскажи примерно как.
И еще: можно ли единожды вывести все эти спрайты лабиринта на экран, а потом не обновлять их таймеров в каждом кадре? они все равно статические. Двигаться будет только один колобок :-)
← →
Darth (2004-10-10 17:30) [3]//где каждый сегмент стены – отдельный класс
Это как?
← →
Ландграф Павел © (2004-10-10 18:39) [4]mozg>непонимаю, а зафиг одним спрайтом?! ты просто не создавай обьекты на каждую стену, а выводи по циклу все карту, которая отображается в данное время
ну типа
for i:=0 to maxX-1
for j:=0 to maxY-1
рисовать(map[i,j].bitmap,0,0,maxX*32,maxy*32)
Зараннее загрузи все битмапы в массив и шуруй...=)
← →
mozg © (2004-10-10 21:57) [5]>>>Это как?
на каждый сегмент стены идет вывод:
procedure RenderMaze(massive:TitemMaze;var spriteeng:TDxSpriteEngine);
var i,j:integer;
begin
for i:=1 to MaxX do
begin
for j:=1 to MaxY do
begin
if massive[i,j]=0 then
with Twall.Create(spriteeng.Engine) do
begin
PixelCheck := false;
Image := form1.dxImageList1.Items.Find("wall");
Width := Image.Width;
Height := Image.Height;
x:=i*Width;
y:=j*Height;
end;
end;
end;
end;
to Ландграф Павел:
Плохо тебя понял. Сказывается отсутствие опыта в работе с DelphiX. Не знаю как в нем реализовать то, что ты написал. А решить задачу надо.
← →
Falcon(TFsoft) © (2004-10-10 22:21) [6]У меня выводится 1200(к отрисовке всреднем по 300) спрайтов прямым методом, тоесть поспрайтово и fps 79.
Возможно скорость падает из-за того что ты крутиш их, или используеш вывод прозрачными или же производиш какие-то вычисление (сложные или массовые) в методе отрисовки или проверки столкновений.
Попробуй не проверять столкновения... ведь всё, я так предполагаю проверяется по массиву 0и1.
Или же попробуй отрисовывать всё как DXBackGroundSprite, у него есть свойство Chip[i,j].
← →
mozg © (2004-10-10 22:38) [7]>>>что ты крутиш их, или используеш вывод прозрачными или же производиш какие-то вычисление (сложные или массовые) в методе отрисовки или проверки столкновений
и не кручу я их, даже методы такие не писал, и не вычисляю ничего, столкновения то же все5 в массиве проверяются...только вывожу...
>>>Попробуй не проверять столкновения
не проверяю...
← →
mozg © (2004-10-10 23:09) [8]кстати, вывод без прозрачности.
← →
Servelat © (2004-10-10 23:28) [9]
> на каждый сегмент стены идет вывод:
Надеюсь та процедура вызывается не в таймере? А то находятся умники, которые создание спрайтов в таймер заносят, и спрайты у них плодятся быстрее кроликов...
> 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-11 05:35) [10]О! То, что надо. Спасибо за помощь! Вечером во всем разберусь и все заработает.
thanks!
← →
Ландграф Павел © (2004-10-11 08:49) [11]Servelat>быстрее? а ты подумай что будет если лабиринт больше размера экрана... все что за экраном будет отрисовываться... в его случае при отсутствии опыта+Delphix легче все стены в один битмап, а выводить паттернами!
← →
П7 (2004-10-11 10:41) [12]И всё-таки это очень странно...
← →
Servelat © (2004-10-11 16:05) [13]
> быстрее? а ты подумай что будет если лабиринт больше размера
> экрана... все что за экраном будет отрисовываться...
За экраном монитора что-либо отрисовать очень проблематично :) .
Как ты наверное сам понимаешь, выводить можно и часть картинки, при этом часть большой картинки выводить все равно быстрее, чем кучу маленьких. В случае отсутствия у кого-либо опыта, этот опыт надо набирать, я же сказал, как сделать быстрее (первоначальная жалоба была на скорость вывода: "Получается ооочень медленно").
2 П7
Ты про что?
← →
mozg © (2004-10-11 17:10) [14]>>>Надеюсь та процедура вызывается не в таймере? А то находятся умники, которые создание спрайтов в таймер заносят, и спрайты у них плодятся быстрее кроликов...
Нет, процедура генерит спрайты при form.create
>>>Реализовывается так:
IL.Items.Find("wall").Draw(DXDraw1.Surface, i*Width, j*Height, 0);
IL - твой DXImageList.
порпробовал так...елси эту процедуру отрисовки запускать при старте проги, то ФПС много, но на экране ничего :-)
Если заиихнуть ее в таймер (что вообщем-то и должно), то результат как и раньше...
сейчас проверю второй способ.
но кажется мне что где-то таиться совсем банальная ошибка...которую просто по неопытности невижу.
← →
Ландграф Павел © (2004-10-11 18:18) [15]Servelat>За экраном монитора что-либо отрисовать очень проблематично :)
Ну ты вообще меня удивляешь... думаешь зачем все делают карты по 32x32? ДА ЗАТЕМ ЧТОБЫ не отрисовывать то, чего не видно! видимо ты про поверхности ничего даже и не слыхивал, а наверное думал про процессор рисует прямо на монитор, пофигу ему на видеокарту, на directx, просто раз и все! А что не попало в экран автоматикой не отрисовывается и ресурсы не жрет... так?
mozg> хе.. хе.. енто ты при загрузке что-ли один раз отрисовываешь, и все? а каким тада макаром будет все отрисовываться??? как раз в таймер его сувать и надо!
← →
mog (2004-10-11 18:31) [16]>>>как раз в таймер его сувать и надо!
я про то и пишу, что 0,Ю иногда 1 ФПС при таком раскладе... :-(
← →
mozg © (2004-10-11 18:32) [17]>>>как раз в таймер его сувать и надо!
я про то и пишу, что 0,Ю иногда 1 ФПС при таком раскладе... :-(
← →
Servelat © (2004-10-11 19:01) [18]
> Ну ты вообще меня удивляешь... думаешь зачем все делают
> карты по 32x32?
Честно скажу, я являюсь частью ВСЕХ, и имею право на собственное мнение. Если под 32x32 ты имел в виду размер тайла - то я видел кучи примеров, где тайлы других размеров. Если ты имеешь в виду количество тайлов по горизонтали и вертикали, то опять же тучи примеров с другими размерами (хотя тут возможна оптимизация с помощью сдвигов для более быстрой работы с массивом). Но как эта фраза связана со всей остальной частью твоего поста я не понимаю.
> ДА ЗАТЕМ ЧТОБЫ не отрисовывать то, чего не видно!
Как это помогает не отрисовывать что-либо я не вижу.
Да, при больших размерах карты, которая еще и изменяется часто, создавать поверхность с отрендеренной на неё картой смысла не имеет, легче отрисовывать только нужный квадрат тайлов. Однако если карта статичная (у автора ветки лабиринт вообще не изменяется) и нужно быстродействие, то мой способ будет предпочтительнее, чем
> все стены в один битмап, а выводить паттернами!
Если не влезает на экран вся карта, тогда выводим её кусок из сгенерированной большой картинки, и ве равно это будет быстрее, чем множество копирований мелких картинок. С этим ты вроде бы не споришь? Тогда не понимаю зачем оскорбления в конце поста (а я это воспринимаю именно как оскорбления):
> видимо ты про поверхности ничего даже и не слыхивал, а наверное
> думал про процессор рисует прямо на монитор, пофигу ему
> на видеокарту, на directx, просто раз и все! А что не попало
> в экран автоматикой не отрисовывается и ресурсы не жрет...
> так?
То что хранится в памяти жрет такой ресурс, как память.
Так как автор ветки не сообщил, помещается ли у него на один экран весь его лабиринт, или нет, то я считал, что помещается. Опять же, не трудно копировать часть поверхности с изображением всего лабиринта на экран, только то, что видно. Обвинения в ламеризме я считаю несостоятельными, я повода на них не давал.
Извиняюсь за офтоп.
2 mozg
Ты ошибку нашел? Если не нашел, то выкладывай куда-нибудь исходник, помогу искать. Удачи.
← →
mozg © (2004-10-11 19:25) [19]>>>помещается ли у него на один экран весь его лабиринт
помещается. но возможно надо будет сделать так, чтобы лабиринт был больше.
www.uic.nnov.ru/~koav34/Labirint.rar
Delphi6, Delphix
← →
Servelat © (2004-10-11 20:25) [20]2 mozg
Тот вариант, который я скачал по ссылке у меня работал с 38-40 FPS"ами. Я тебе по мылу послал свой вариант, немного мелких исправлений внес, теперь FPS 84-85, по сравнению со старым вариантом FPS вырос в 2 раза. Однако почему у тебя FPS 0-1 был я не знаю, может железо старое очень?
← →
Ландграф Павел © (2004-10-11 21:28) [21]Servelat>не охото спорить=) каждый при своем мнении! я всегда забываю про уважении чужого мнения... ведь скока раз зарекался не спорить, извини! в ламеризме не обвиняю, просто меня убила издевательская фраза с твоей стороны "За экраном монитора что-либо отрисовать очень проблематично...", просто я так понял что ты действительно думал что если вывести картинку 800х600 пикселей при разрешении 800х600, и 1600х1200 пикселей, но с этим же разрешением 800х600 (то есть мы увидим тока 800х600, края будут за экраном), то fps будут те же... а это извините ламеризм, согласен?
← →
mozg © (2004-10-11 21:30) [22]железо на уровне у меня:
intal pent 4 2600 HT
GF4 mx440 128
итд..короче не в железе дело, игры на ура скачут :-)
← →
mozg © (2004-10-11 21:48) [23]to Servelat
Я пока просто мимоходом глянул...85 ФПС стабильно! Круто!
насчет "? "byte" не достаточно? :) тут даже "boolean" хватит", просто там еще другие элементы возможно будут, я пока не знаю, поэтому взял по максимуму :-) но byte действительно хватит. но пока меня это не беспокоит :-) в азах бы разобраться, а уж оптимизация - дело последнее...хотя почему у меня 0 ФПС выдает при моем подходе, а у тебя 45....странно это.
за исправления и подробные объяснения спасибо огромное!
← →
Servelat © (2004-10-11 21:54) [24]2 Ландграф Павел ©
Согласен, без обид :-) .
2 mozg
> поэтому взял по максимуму
Почему не Int64? :) .
← →
mozg © (2004-10-12 06:51) [25]>>>Почему не Int64? :)
:-))) Да я уж подумывал об Extended :-)
← →
A22 (2004-10-21 13:25) [26]Граждане, попробуйте выводить спрайты через Direct3D, для всех спрайтов, имеющих общую текстуру, формируя 1 буфер вершин, и нормальная будет скорость.. а заодно и прозрачность и повороты и что хотите..
← →
Paravoz (2004-10-27 04:17) [27]2 Mozg:
> железо на уровне у меня:
> intal pent 4 2600 HT
> GF4 mx440 128
Фиговая видюха - ты GF4 Ti не пробовал
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.041 c