Az elmúlt két nap még mindig a framek vadászásával telt. Most arról olvashattok röviden, hogy mire jutottam és ez nem feltétlenül jelenti azt, hogy mindenhol igazam van... ;)
Egyszerűbb headset nélkül
Ha még nem tetted, kapcsold át a telefonod GearVR Dev módba. Így nem kell felkapnod a fejedre mindig a headset-et, hogy kipróbáld amit alkottál. Emellett maradhat a telefon USB-n és már mehet is a profiling.
Ennek egészen érdekes mellékhatása, hogy cardboard-ban is egészen használhatóak utána a GearVR appok.
Application Manager -> All -> GearVR Service -> Manage Storage és tappoljatok hétszer a VR Service Version-re. Ezután a Developer Mode elérhető lesz egy kapcsolóként.
Fontos, hogy ezeken a kereteken belül maradj, ha folyamatos képet szeretnél látni:
- 50 – 100 draw call/frame
- 50k – 100k polygons/frame
- Amennyire kevés textura csak lehetséges(de lehetnek nagyok)
- 1-3 ms script execution - Unity Update()
- + nem árt tudni, hogy ha 60FPS alá esik a framerate, akkor az oculus azonnal stabil 30FPS-re húzza le. Soha ne essetek 60FPS alá!
Amik mindenképpen legyenek bekapcsolva a Unity project settingsben:
- Static batching
- Dynamic batching
- GPU skinning
- Multithreaded Rendering
- Default Orientation to Landscape Left
A mesh-ek számának csökkentése
A draw call-ok számának csökkentése hozta meg számomra legjelentősebb javulást. A pályán található tile-ok mindegyike egy-egy quad object volt. Ezekből közel 100 darab volt lepakolva.
Feljebb ugye azt írtam, hogy 50-100 draw az ideális gearVR-on, így már csak a tile-ok kirajzolásával a határt feszegettem és a díszítő elemekről, tornyokról és az összes többi object-ről még nem is beszéltünk.
A megoldás pedig nem más lett, mint a Mesh.CombineMeshes hívás.
Első körben elkezdtem megírni a saját script-emet hozzá. 1-2 óra alatt sikerült eljutnom odáig, hogy már volt egy egységesített mesh-em minden object-ről, viszont a material-okat még nem kezelte külön. (itt nem csak a tile-okról volt szó, hanem a teljes pályával próbálkoztam) Az pedig nem szép, ha minden ugyanolyan színt kap.
Mivel már éjfél után jártam bőven ezen a ponton, de nem akartam úgy kidőlni, hogy még mindig akad a játék így az asset store-hoz folyamodtam, ahol azonnal meg is lett amit kerestem. Egy kattintással összehúzta a szükséges gameobjecteket és a materialok is megvoltak hozzá.
Visszatérve a tile-ok kérdésére: lett egy olyan tile object-em amin mindegyik rajta volt egyetlen mesh-ként. Így viszont nem működik a tile kijelölés, mert ugye az összeset jelölném ki egyszerre. Szóval megtartottam a régi tile-okat is, csak Start()-nál kikapcsolom a mesh rendert és csak akkor kapcsolom vissza őket, ha ki vannak jelölve. Alatta pedig ott van a korábban egyesített mesh, hogy látszódjona tile-ok helye.
Ugyanez a módszer el lett játszva a turretek-kel is, amiket primitive-ekből építettem. Ahogy rájuk néztem azonnal visszaesett a framerate 30-ra. Szóval ezeket is sikerült optimalizálni a fent linkelt tool-al. Most már egészen stabil a 60FPS.
Material-ok változtatása
A kijelölt tile-ok és platformok esetében a material color és emission értékét módosítom script-ben. Mikor bármi változik a Renderer.material-ban akkor egy másolat keletkezik az adott material-ból. A legtöbb helyen azt ajánlják, hogy a sharedMaterial-t módosítsam, viszont esetünkben ez nem járható út, mert ha kijelölök egy platformot, akkor az összes megkapja a kijelölés színt.
A megoldásnak jelen pillanatban az tűnik, hogy létrehoztam egy selection materialt és egyszerűen kicserélem erre mikor fölé megyek a kurzorral. Eddig jónak tűnik, de ezt már nem volt időm alaposabban letesztelni az este.
A bejegyzés trackback címe:
Kommentek:
A hozzászólások a vonatkozó jogszabályok értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a Felhasználási feltételekben és az adatvédelmi tájékoztatóban.