Skocz do zawartości

[Delphi+Omega] Wydajne czy nie ?


Adrian B.

Polecane posty

Witam piszę silnik renderujący teren za pomocą kostek. I zastanawiam się czy rozwiązanie jakie przyjąłem jest optymalnym a w ostateczności dopuszczalnym rozwiązaniem.

Zamieszczę głównie procedurę rysującą :

//Ofset dla indexu początkowego
offset.X := WorldPosit.X div wsize;
offset.Y := WorldPosit.Y div wsize;
//Offset dla położenia indexu początkowego
pxoffset.X := WorldPosit.X mod wsize;
pxoffset.Y := WorldPosit.Y mod wsize;
//Rysowanie
for x:= -1 to (ScreenSize.X div wsize) +1 do
for y:= -1 to (ScreenSize.Y div wsize) +1 do
if (x+offset.X >= 0) and (x < WorldSize.X ) then //dla poprawnego zakresu osi x
 if (y+offset.Y >= 0) and (y < WorldSize.y ) then //dla poprawnego zakresu osi y
 begin
for i:= 0 to 2 do  //dla 3 warst
begin
 temp := @layer[i][x+offset.x][y+offset.y];  //Zbieramy info o kostce
 if temp.idgroup >= 0 then //jesli empty tilegrup = 0 nie renderuj
if temp.animcount = 0 then // jesli nie ma animacji
omil.ImageList.Items[temp.idgroup].Draw(x*wsize-pxoffset.X,y*wsize-pxoffset.Y,temp.rot,0.5,0.5,1,1,OmegaColor(temp.r,temp.g,temp.b,temp.a),temp.hm,temp.vm,temp.idtile)
else
begin //Jesli jest animacja
 temp.entime := temp.entime + elipsedtime;
 if temp.entime > temp.timecount then     //Jesli nastepuje zmiana animacji kratki
 begin
temp.entime := 0;
inc(temp.animpos);
if temp.animpos > temp.animcount then //Jesli przekroczymy zakres
 temp.animpos := 0;
 end;
 omil.ImageList.Items[temp.idgroup].Draw(x*wsize-pxoffset.X,y*wsize-pxoffset.Y,temp.rot,0.5,0.5,1,1,OmegaColor(temp.r,temp.g,temp.b,temp.a),temp.hm,temp.vm,temp.idtile+temp.animpos);
end;
end;
 end;

 

Zakładając że :

 

wsize - rozmiar kostki

WordPosit (TPoint) - pozycja przesuniecia mapy (w pikselach)

 

Czy jesteście w stanie mi coś poradzić aby przyśpieszyć nieco sam proces jeszcze ? Czy może pozostawić tak jak jest ?

Link do komentarza
Udostępnij na innych stronach

nie jest wydajne, da sie to okolo 3-4 razy przyspieszyc jak zminimalizujesz liczba zmian textur, omil.ImageList.Items[temp.idgroup].Draw moze powodowac zmiane textury ktora jest bindowana. Jak posortujesz rysowanie w kolejnosci od najczestrzej textury do najrzadszej. I bedziesz renderowal wszystkie kafle dla danej textury w jednym przejsciu bedzie szybciej. Pytanie tylko czy dla wielowarstwowej mapy jaka pokazujesz da sie takie cos zrobic ? Na 100% da sie zrobic per layer ale nie wiem czy w twoim przypadku da sie polaczyc rysowania ze wszystkich layerow.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

nie jest wydajne, da sie to okolo 3-4 razy przyspieszyc jak zminimalizujesz liczba zmian textur, omil.ImageList.Items[temp.idgroup].Draw moze powodowac zmiane textury ktora jest bindowana. Jak posortujesz rysowanie w kolejnosci od najczestrzej textury do najrzadszej. I bedziesz renderowal wszystkie kafle dla danej textury w jednym przejsciu bedzie szybciej. Pytanie tylko czy dla wielowarstwowej mapy jaka pokazujesz da sie takie cos zrobic ? Na 100% da sie zrobic per layer ale nie wiem czy w twoim przypadku da sie polaczyc rysowania ze wszystkich layerow.

Czyli jak dobrze rozumiem spowolnienie wynika z tego że omil.ImageList.Items[temp.idgroup] z każdym przejściem "wymusza" odnalezienie elementu tablicy. A co jeśli do informacji o kostce zachowywał bym np wskaźnik do omil.ImageList.Items[LICZBA] i później kazał rysować poprzez właśnie ten wskaźnik ?

 

Ps.Jesli zle Cię zrozumiałem to dlatego że nie znam sformułowania bindowania tekstury xd

Link do komentarza
Udostępnij na innych stronach

odnalezienie elementu w tablicy to pomijalny czas, bindowanie textury:

http://www.google.com/search?client=opera&...=utf-8&oe=utf-8

wejdz sobie do zrodel omegi i popatrz co sie dzieje jak wywolujesz draw.

 

 

Myslalem o tej twojej segregacji i doszedłem do wniosku że wtedy można byłoby dzielić świat na równe sektory dla których byłyby wyliczane przy tworzeniu mapy posegregowane listy tekstur, tak aby tej czynnosci nie powtarzać w czasie działania odpowiedniej aplikacji, jednak dla 3 warstw,aby móc zrealizować ten zamiar w funkcji draw musiałbym mieć głębokość (z).

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...