Android Programjaim

Android fejlesztes, java, kotlin, web.. miegymas:)

Android Opengl ES játékfejlesztés - még néhány tapasztalat

2011. április 27. 16:38 - lacas82

Először is legutóbb kihagytam egy elég jó kis játékmotort, most pótolom! Libgdx
Ez egy nagyon jó kis motor, JNI-vel megírva.

Lássuk akkor a játékfejlesztés tapasztalatokat.

-használjunk glCullingot ahol lehet, ezzel pár FPS-el több lehet
-a vertex kezelésnél GL_FLOAT helyett GL_SHORT kell, mivel a SHORT fele annyit foglal a memóriában és gyorsabb.
-használjunk VBO-t
-minél kevesebb texture bind-ot alkalmazzunk egy frame-kor, mivel ez sokat eszik
-használjunk ahol lehet static-et, illetve final static-et
-azt írták máshol, hogy interface-t ne használjunk, mert lassít
-ami még lassít: alpha cuccok, átlátszóság, tehát ezt is kéne hanyagolni... 
-rögtön a GL kontextus után kell inicializálni a fontosabb dolgokat, példa: gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);       gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
ezeket hülyeség már a .draw híváskor hívogatni, ez is nagyon lassít...

-végül azt kell tudni, hogy mindezek pár FPS-et javítanak a játékunkon, de mindez óriásit számít végül...

-JNI hívások: elvileg hogyha a GL kontextus létrehozásakor meghívunk egy JNI hívást (natív hívást), és az egész renderelést/számításokat C-ben megírjuk lehet, hogy gyorsabb lesz, mint a java verziója.:) ezt azért még nem próbáltam...Aki csinált már ilyet androidon az jelezze, kíváncsi vagyok mennyivel gyorsabb egy JNI-s opengl egy java-snál...

-végül olyan apróságok, hogy ne használjunk mezei array-t, hanem HashMap-et, Listeket
-nagy textúrákat sem igen szereti a GL
-hülyeség Scale-elni egy közepes cuccot teljes képernyőre, ettől az FPS csökken, inkább használjunk glTranstale-et!

-Végül pár PRO dolog: tömörített textúrák kezelésével újabb értékes FPS időt nyerünk, de ez már tényleg PRO...ugyanis minden gyártónak külön textúra "típusa" van, így pl a .pvr az olyan tömörített textúra, ami a PowerGSX GPU-kra írt formátum. (PNG helyett) Na most ezzel megint az a gond, hogy van ebből is 4-5, és nem igazán van hozzájuk konverter. Eddig legalábbis egyedül a .pvr(PVRTC 4bpp or 2bpp)-hez találtam, de persze betölteni se tudtam...aztán pl ahány gpu készítő van, annyi ilyen formátum. Mellesleg pedig az androidos GL-ben nem igazán volt glCompressedTextured opció. Aki csinált már ilyet androidon az jelezze!:)
 
#Update:
Galaxy S-es értékek: 100-150 square-nél kb 30-45 FPS (alphával, transparent bg-s png-kkel), 50-55 FPS kb 80-100 textured square-ig.
 
Live Wallpapernél: olyan 70-80 square-re: 30-40FPS. Persze HTC Legenden az értékek már rosszabbak.:( Ott vehetjük ennek a harmadát is.