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

Вниз

Вывод спрайтов как одного   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.046 c
10-1082218425
Karbo
2004-04-17 20:13
2005.01.30
Как избавиться от сообщений Excel при закрытии Workbooks ?


1-1105969512
AlexP11
2005-01-17 16:45
2005.01.30
Эмуляция нажатия клавиши


6-1099927417
MegaVolt
2004-11-08 18:23
2005.01.30
Как на сервере определить MAC клиента?


1-1106046420
ShimON
2005-01-18 14:07
2005.01.30
Обработать выход из Windows


1-1105693074
Neznaika
2005-01-14 11:57
2005.01.30
Куда поставили мою программу?