Android Programjaim

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

Android performance up - startMethodTracing

2011. március 05. 12:36 - lacas82

Lassú a progink/játékunk, esetleg laggol néha? Mi lehet a megoldás? Kell egy performance viewer, jelen esetben az android tools könyvtárában található traceview.exe. Ha esetleg nem találna java-t, akkor a tools/lib/find_java.bat filet írjuk át így: set java_exe="F:\jre1.6.0_07\bin\java" nekem a java.exe-m itt található ugyanis. Persze a Windows környezeti változókkal is bütykölhetünk, de nekem ehhez nem volt kedvem.

Hogyan készítsünk trace-t a proginkról?
Egyszerűen az apk-nkban a kívánt function elé és utána tesszük ezeket a sorokat, pl.:

Debug.startMethodTracing("mygame");
   draw_all();
Debug.stopMethodTracing();

Ezek után a mi kis programunk létrehozott egy trace filet az SD kártyánk gyökerébe mygame.trace néven. Ezt átmásoljuk mondjuk ide: C:\mygame.trace

a \tools\ könyvtárba beírjuk a következőt: traceview C:\mygame

Ekkor egy következő ablakot kapunk ha minden jól ment:


 

Ügyes ugye? Az előjött ablak persze elsőre elég kusza, talán még másodikra is... Aztán észrevesszük, hogy ms-ben a methodok által lefoglalt időket látjuk, grafikusan is. Így ha valamelyik sor túl nagynak tűnik, ott valószínűleg hiba lehet a programunkban, tehát lehetne rajta optimalizálni. A fenti példakód az én játékom trace-je, ami jelen esetben még eléggé laggol néha. (teszem azt 20 ellenfél, particle-kkel, rakétákkal, de leginkább a hülyén megoldott Font rajzolástól is, plusz az animált texturecoords is sok időt lefoglalt, ezeken javítanom kell:)!) Gondoltam leírom, hogyan kell ezt, mert csak külföldi pár oldalon láttam. Esetleg valakinek majd jól jön:)

UI.(tapasztalatok):
1, egy játékban mindig a legfontosabb dolgokat rajzoljuk ki! Felesleges pl kondenz-csikot húzni egy repülő után, akkor már inkább jobb, ha egy sprite sheeten lépegetünk. Ezek ugyanis értékes real-time időt vesznek igénybe.

2, A betűket/szövegeket ugye ki kell rajzolnunk valamilyen módon egy openGL ES-ben. Ennek általában megint van többféle módja. A fentebb látható képen látható, hogy ott bizony elbarmoltam a font kirajzolást (persze dinamyctext-ről van szó), ugyanis real time készítettem a textúrákat a szövegből, ami szintén nem jó. Valamilyen kompromisszumot mindig kötnünk kell: általában jobb ha kezdetben töltjük be egyben a textúrákat, és akkor ott lesz lassabb, de akkor feltehetően nem fogja bántani már a renderelési időt... Az általam írt engine-ben jelenleg még van pár olyan megoldás, amit jelenleg nem tartok túl elegánsnak, előnyösnek, tehát a már említett textureCoords-al való babrálás real time-ban, ami megint sok időt zabál. Mi lehet a jó megoldás? Fogunk egy Fontbitmap sprite sheetet, amire ki van rajzolva 256 karakter. Kezdetben mind a 256 karakterről (vagy amennyi kell) készítünk egy texturát Canvasból. Nevén nevezzük a dolgokat, hogy később hivatkozhassunk rá: "font32" pl jelzi a 32-es ASCII texturáját. Persze így meg elég sok textúránk lesz, viszont nem nagy méretűek. Teszem azt a textúra mérete 512*512, és egy karakteré 32*32, akkor lesz egy sorban 16 karakterünk. Tehát az ebből kivágott kis textura csak 32*32 px lesz, amiből viszont lesz vagy 256, vagy csak annyi, amennyit szeretnénk. (pl csak a numerikus karakterek, vagy a-z)

3, ahol lehet használjunk static-ot, final-t, ha lehet akkor lokális változókat használjunk a legtöbbször a metódusainkban. (példa, iterálás egy arraylisten, hashmapen, tömbön)

4, renderelés közben a String dolgok lassúak, pl.: string.startsWith("akarmi") akár 2-5 ms-t is elvehetnek.

Folyt köv.