Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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.046 c
1-1105976906
SV
2005-01-17 18:48
2005.01.30
Библиотека для сканирования и распознавания изображения ?


3-1104013064
Никола
2004-12-26 01:17
2005.01.30
Печать платежных поручений


6-1100429655
Алексей
2004-11-14 13:54
2005.01.30
IID_IHTMLElementRender на Дельфи 6


3-1104142318
Otari
2004-12-27 13:11
2005.01.30
Помощь !!


1-1105958578
Mishenka
2005-01-17 13:42
2005.01.30
Нетипизированный указатель





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский