Adrian B. Napisano Sierpień 8, 2010 Zgłoś Share Napisano Sierpień 8, 2010 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 More sharing options...
Toster Napisano Sierpień 8, 2010 Zgłoś Share Napisano Sierpień 8, 2010 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 /> Link do komentarza Udostępnij na innych stronach More sharing options...
Adrian B. Napisano Sierpień 8, 2010 Autor Zgłoś Share Napisano Sierpień 8, 2010 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 More sharing options...
Toster Napisano Sierpień 9, 2010 Zgłoś Share Napisano Sierpień 9, 2010 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. Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Adrian B. Napisano Sierpień 9, 2010 Autor Zgłoś Share Napisano Sierpień 9, 2010 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 More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.