Tworzę opartą na sprite grę 2D na platformy mobilne i używam OpenGL (właściwie Irrlicht) do renderowania grafiki. Najpierw zaimplementowałem renderowanie ikonek w prosty sposób: każdy obiekt gry jest renderowany jako quad z własnym wywołaniem losowania GPU, co oznacza, że gdybym miał 200 obiektów gry, wykonałem 200 wywołań losowania na ramkę. Oczywiście był to zły wybór, a moja gra była całkowicie związana z procesorem, ponieważ w każdym wywołaniu GPU występuje niewielki narzut procesora. GPU przez większość czasu pozostawała bezczynna.
Teraz pomyślałem, że mogę poprawić wydajność, gromadząc obiekty w duże partie i renderując te partie za pomocą zaledwie kilku wywołań losowania. Zaimplementowałem przetwarzanie wsadowe (aby każdy obiekt gry o tej samej teksturze był renderowany w tej samej partii) i pomyślałem, że moje problemy zniknęły ... tylko po to, aby dowiedzieć się, że moja częstotliwość klatek była jeszcze niższa niż wcześniej.
Dlaczego? Mam 200 (lub więcej) obiektów gry i są one aktualizowane 60 razy na sekundę. W każdej ramce muszę ponownie obliczyć nową pozycję (translację i obrót) dla wierzchołków w CPU (GPU na platformach mobilnych nie obsługuje instancji, więc nie mogę tego zrobić) i wykonując te obliczenia 48000 na sekundę (200 * 60 * 4 od czasu każdy duszek ma 4 wierzchołki) po prostu wydaje się być zbyt wolny.
Co mogę zrobić, aby poprawić wydajność? Wszystkie obiekty gry poruszają się / obracają (prawie) każdą klatkę, więc naprawdę muszę przeliczyć pozycje wierzchołków. Jedyną optymalizacją, o której mogłem pomyśleć, jest tabela przeglądowa dla obrotów, aby nie musiałem ich obliczać. Czy punktowe duszki by pomogły? Jakieś paskudne hacki? Coś jeszcze?
Dzięki.