HTML

gondolataim elsősorban játékfejlesztésről

Elsősorban játékfejlesztés magyarul: az enginem fejlesztése során felmerülő problémák, ötletek, tévutak stb dokumentálása, amely számomra és talán mások számára is hasznos lehet később Másodsorban gondolatok szavakban...

Kapcsolat:
aalberik 'at' gmail 'dot' com

Haletető

Galéria

Címkék

Összes

Linkblog

Naptár

május 2025
Hét Ked Sze Csü Pén Szo Vas
<<  < Archív
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Demo 3 - Soft body

2010.01.31. 19:15 :: syam

Az engine kiegészült soft body támogatással, amelyhez a tetrahedra mesh-t az Ageia nxtetra.dll-je segítségével készíti el így nincs szükség külső programra a konverzióhoz.

Továbbá a renderelés további optimizációjaként scissor test is be lett iktatva.

A logolás már lekérdezi a legtöbb rendszer információt.

A főszereplő még mindig "a" láda és a mozgatás sem változott. A pálya méretét kicsit megnöveltem.
 

Induláskor alacsony az fps, az összes soft body aktív volta miatt. Ezenkívül előfordulhat későbbiekben is alacsony fps a következők miatt. A soft body szimuláció esetleges instabilitása miatt egyszerre sok soft body lehet aktív. Természetesen ezek a későbbiekben javítva lesznek.

 

Konfigurálás:

A user/config.ini alábbi beállításait érdemelnek figyelmet:

window_width: tipusa integer, az ablak szélességét jelenti.
window_height: típusa integer, az ablak magasságát jelenti
window_fullscreen: típusa bool, teljes képernyő vagy ablakos üzemmód
vsync_enabled: típusa bool, VSync engedélyezése/tiltása
physics_accuracy: típusa integer, egy frame alatt számolt fizikai lépések száma
softbody_accuracy: típusa integer, egy frame alatt számolt soft body szimulációs lépések száma - nagyon érzékeny érinti az fpst!
 

Letöltés:

www.inspekcio.hu/indigo_illusions/demos/sakura_demo_2010_01_31.zip

Min. követelmény:
CPU: mindegy
RAM: min. 512 MB
videokártya: SM2.0, gyártó mindegy
OS: WinXP
(feltelepített és nemrég kiadott) PhysX driver - letölthető innen http://www.nvidia.com/object/physx_9.09.1112.html

 

Szólj hozzá!

Címkék: ageia softbody scissor test nxtetra

Demo 2 - PhysX v283 vs Bullet v275

2010.01.24. 14:34 :: syam

Az évek során az engine sokféle ingyenesen elérhető fizikai motort használt.

Az első az ODE volt, amelynek a képességei nem tűntek kielégítőnek. Néhány próbát megért a True Axis is aztán a Bullet következett míg a végső befutó a PhysX lett.
Ezek közül a PhysX a legkiforrottabb - több éve fejlesztik, amely során kétszer váltott tulajdonost. Először Novodex-nek hívták (ezt a korszakot még ma is őrzik az elnevezések) aztán Ageia PhysX névre keresztelték majd az Nvidia vette szárnyai alá.

Ami miatt ismét elővettem a Bullet-et az elsősorban a hordozhatóság és az akcióm ereménye eredménye az alábbi teszt lett...

 

TulajdonságPhysXBullet
Telepítést igényelIgenNem
Támogatott platformokPC, PS3, Xbox 360, Wii, LinuxPC, PS3, Xbox 360, Wii, Linux, Mac OSX, iPhone
Hardveres támogatásAgeia kártyák 2.8.1 verzióig
Videókártyák SM4.0-tól
CUDA támogatás
TöbbszálúságMegoldottMegoldott, de esetemben fagyott
SIMD támogatásMegoldottMegoldott
Szilárdtest ütközésvizsgálat és fizikaSpecializáltság, trimesh-trimesh ütközés nem támogatott

Esetek túlnyomó többségében stabil
Jobbára általános algoritmusok

Tömegre és inertia tensor-ra nagyon érzékeny, instabil különösen trimesh-convex esetben
Puhatest ütközésvizsgálat és fizikaKülön puhatest és ruha szimuláció, testek közötti ütközés nem támogatott. Puhatest készítése körülményes A ruha szimuláció a puhatest szimuláció spec. esete, testek közötti ütközés támogatott. Puhatest készítése egyszerű
Relatív teljesítmény1.3 - 1.5 1
 

Mindent összevetve a PhysX - bugjai ellenére is - még mindig a leghatékonyabb, ingyenesen elérhető fizikai motorok közé tartozik.

Az összehasonlító demo letölthető innen: www.inspekcio.hu/indigo_illusions/demos/sakura_demo_2010_01_24.zip.


Mindkettő alkalmazás ugyanazt a jelenetet tölti be, a főszereplő "láda" QWASD + egér kombinációval irányítható. A mozgás kaotikusnak tűnhet a szabad mozgás miatt. Megfigyelhető a PhysX és Bullet motorok közötti különbség.

Szólj hozzá!

Címkék: bullet ageia ode physx novodex

Demo 1

2010.01.17. 19:54 :: syam

Hosszas készülődés után elkészült a portál engine demója.

A csomag letölthető innen: http://rapidshare.com/files/336823161/sakura_demo_2010_01_17.zip

vagy innen:

www.inspekcio.hu/indigo_illusions/demos/sakura_demo_2010_01_17.zip

Min. követelmény:
CPU: mindegy
RAM: min. 512 MB
videokártya: SM2.0, gyártó mindegy
OS: WinXP
(feltelepített és nemrég kiadott) PhysX driver - letölthető innen http://www.nvidia.com/object/physx_9.09.1112.html

 

Az alkalmazás a belső teres megjelenítést kívánja bemutatni és a következőket tudja:

Egy adott szereplő mozgatása WASD+Q billentyűkkel és egérrel.
Interakció tárgyakkal.
A user/log.txt-ből kiderül a videokártya gyártója és OpenGL verziószáma ill. a min. és max. FPS.

És amiket nem tud:

Kezeletlen hiba esetén (SM2.0 videokártya alatt, telepítetlen PhysX) fagy.
Lekezelt hiba esetében kilép. Esetlegesen a user/log.txt file tartalmazhat információt a hiba okáról.
Hibás vágás; amennyiben a kamera nézőpontja elhagyja a belső teret - ilyenkor látszik a fekete háttér.
A karakter mozgása egyszerű csúszkálás.

Konfigurálás:

A user/config.ini alábbi beállításait érdemelnek figyelmet:

window_width: tipusa integer, az ablak szélességét jelenti.
window_height: típusa integer, az ablak magasságát jelenti
window_fullscreen: típusa bool, teljes képernyő vagy ablakos üzemmód
vsync_enabled: típusa bool, VSync engedélyezése/tiltása
physics_accuracy: típusa integer, egy frame alatt számolt fizikai lépések száma

 

A demó lényege a kompatibilitás, stabilitás ill. a teljesítmény mérése. 

 

Szólj hozzá!

Címkék: portal physx térfelosztás

A 3D gyorsítók textúrakezelése 2

2009.12.13. 23:06 :: syam

A folytatásban először ismerkedjünk egy ma már (szerencsére) alig használatos textúra típussal az ún. texture rectangle-vel. Manapság ezeket felváltották az NPOT méretű textúrák, melyekkel ellentétben sok korláttal rendelkeznek.

  • Csak az alábbi textúra címzésre képesek: GL_CLAMP, GL_CLAMP_TO_EDGE és GL_CLAMP_TO_BORDER. Ez utóbbi egy kicsit zavarba ejtő, hiszen
  • A textúráknak nincs szélük.
  • A textúra koordinátákat közvetlenül címként kell megadnunk vagyis felbontástól függően.
  • Nem támogat mipmap-elést.

Jelentősége abban állt, hogy minőségvesztés és memórapazarlás nélkül közvetlenül lehetett tetszőleges méretű képeket felhasználni.

Ezután ismerkedjünk meg a TMU egy érdekes funkcionalitásával, amely a hangzatos shadow nevet kapta. Ez azon alapul, hogy a TMU-k (többsége) képesek a címzés (és talán a szűrés) után elvégezni még egy műveletet, egy összehasonlítást. Ezt az összehasonlítást a GL_TEXTURE_COMPARE_MODE paraméterrel szabályozhatjuk. Amennyiben a funkciót ki szeretnénk kapcsolni a GL_NONE-re kell állítanunk.
A másik lehetőség az hogy az összehasonlítást a mintavételező textúra koordináta R komponense és a mintavételezett texel között hajtsa végre. Ekkor GL_COMPARE_R_TO_TEXTURE-re kell állítanunk a funkciót.
Azt, hogy a vizsgálat iránya milyen legyen a GL_TEXTURE_COMPARE_FUNC paraméter szabályozza ugyanúgy, mint a mélységi teszt vagyis lehet GL_LEQUAL, GL_GEQUAL, GL_LESS, GL_GREATER, GL_EQUAL, GL_NOTEQUAL, GL_ALWAYS és GL_NEVER.
 

Hogyha az összehasonlítás bekapcsolt állapotban van, akkor

  • az aktuális textúrának mélységi textúrának kell lennie (egyébként az összehasonlítás elmarad)
  • nem használható mipmap
  • nem használható 3D texture
  • cube map használható azonban nem minden GPU rendelkezik ezzel a képességgel.
  • a TMU nem az eredeti texel értékét, hanem az összehasonlítás eredményét fogja visszaadni. Azt, hogy milyen formában a mélységi textúra beállításakor adhatjuk meg (itt csak megemlítjük, hogy GL_ALPHA, GL_LUMINANCE és GL_INTENSITY lehet).

NVidia platformon ha a textúraszűrést GL_LINEAR-ra kapcsoljunk, ingyen kapunk egy 2x2 bilineáris szűrést, amely némi segítséget jelent a soft shadow implementálásához.

 

Szólj hozzá!

Címkék: npot texture rectangle tmu shadow map

A 3D gyorsítók textúrakezelése

2009.12.12. 15:00 :: syam

Mottó:

Mi a textúraszűrés?
Mipmapszintösszemosás.
Nem. Mipmapszintösszevisszamosás.

Túlragozod.
Nézd meg az anizotróp szűrést aztán rájössz, hogy nem.

 

A textúrázás már régóta elengedhetetlen követelmény a 3D játékok körében. Azonban, mint mindennek ennek is ára van. Szerencsére már a korai videokártyákák óta létezik az ún. TMU (texture mapping unit) vagyis texturázó egység, amelyeket kimondottan a textúrázás gyorsítására fejlesztettek ki. Ezek régebben külön processzorban kaptak helyet, ma már egybeépítik a GPU-val.

A TMU-nak két nagy feladata vannak a hagyományos (szín komponenseket tároló POT méretű) textúrák esetében - texture addressing (textúra címzés) és a texture filtering(mintavételezés) - amelyek elvégzése után szolgáltatja a mintavételezés eredményét.

Texture addressing

Ekkor történik a textúra koordináták textúra címekké való transzformálása, amelyet úgy képzelhetünk el a legkönnyebben, mintha a koordinátákat a mintavételezéshez szükséges 0.0 és 1.0 tartományba szorítaná be (clamp) az eljárás, amely mechanizmusból az idő során sokféle variáció keletkezett.

  • GL_REPEAT: ez legelső technikák egyike. Ilyenkor a koordináták egészrészét elhagyva viszi át a céltartományba az értékeket vagyis későbbiekben a textúra az adott irányban ismétlődni fog.
  • GL_CLAMP: ez is szintén korai technika. Lényege, hogy a koordinátákat nem hagyja ismétlődni, mert az 1-nél nagyobbi számokhoz 1-t rendel míg a negatív számokhoz 0-t.
  • GL_CLAMP_TO_EDGE: az előbbi technika fejlesztett változata. A kettő közötti különbségről később szólunk.
  • GL_CLAMP_TO_BORDER: ez is hasonlít ez előző kettőhöz a különbség annyi, hogy a negatív és 1-nél nagyobb tartomány mintavételezéséhez a keret színét használja fel és nem a textúrát.
  • GL_MIRRORED_REPEAT: mint ahogy a neve is mutatja egyfajta tükrözésről van szó. A GL_REPEAT-től annyiban különbözik, hogy a páratlanadik ismétléskor a 0.0 - 1.0 tartományt 1.0 - 0.0 tartományba viszi át.
  • GL_MIRROR_CLAMP: hasonló az előzőhöz, de a tükrözést csak az első páratlanadik esetben végzi el
  • GL_MIRROR_CLAMP_TO_EDGE és GL_MIRROR_CLAMP_TO_BORDER: ezek a megfelelő technikák kombinálásának eredménye

Miután megszületett a textúra cím, akkor azon a helyen (vagy környékén) történik (történnek) a mintavételezés(ek) az előzőleg beállított szűrési paramétereknek megfelelően.
Arról sajnos nincs tudomásom, hogy több mintavételezés esetén a textúra címzés vizsgálata mindegyik textúra koordinátára is lefut-e. Mindenesetre a GL_CLAMP és GL_CLAMP_TO_EDGE típusok közötti különbség erre enged következtetni mivel utóbbi esetben (általában) nem történik túlcímzés a szomszédok mintavételezésekor. Gyakorlatban ez egy zavaró, egysoros texelcsík megjelenését eredményezi a textúrák szélein.

 

Texture filtering

A textúraszűrés lényege, hogy nem egy, az aktuális címről történt mintavételezés eredménye lesz a visszaadott érték. Ennek akkor a legszembetűnőbb a hatása amikor a textúra felhasználása során eltérő sűrűséggel veszünk belőle mintát. Alacsony a mintavételezési sűrűség (alulmintavételezés) akkor amikor a textúrát nagyítjuk ("pixeles" lesz a kép). Magas a mintavételezési frekvencia (túlmintavételezés), amikor a textúrát kicsinyítjük ("zizeg" a kép). Ezen esetekre kínál megoldást a szűrés, amelynek három lehetséges variánsa van: textúrán belüli, textúrák közötti, anizotróp.

A textúrán belüli szűrést már említettük. Amennyiben ezt bekapcsoljuk a mintavételezés a szomszédos címekről történik és a súlyozott átlagértékük (itt két lineáris interpolációról (bilinear) beszélhetünk; innen a neve LINEAR) lesz az eredmény. Ez kicsinyítéskor és nagyításkor lehetséges. Ha ezt nem kapcsoljuk be, akkor a textúra koordinátából számított legközelebbi textúracímről (NEAREST) történik a mintavételezés.

Textúrák közötti szűrés akkor lehetséges, ha azok egy mipmap készlet részei. Ilyenkor két, különböző mipmap szinthez tartozó textúrán belüli szűrés után a két kapott eredmény súlyozott átlaga lesz a végeredmény. Ez a szűrés típus csak kicsinyítéskor lehetséges mivel az alap mipmap szinttől nincs részletesebb textúra a készletben. Azt, hogy a mipmap készlet melyik két textúráját használja fel a TMU a mintavételezés frekvenciájából dönti el. A választását mi megváltoztathatjuk a GL_TEXTURE_LOD_BIAS segítségével.

Az itt elmondott variációk alapján a következő szűrések lehetségesek:

  • GL_NEAREST - 1 mintavételezés
  • GL_LINEAR - 4 mintavételezés

Amennyiben a textúrák közötti szűrést is bekapcsoljuk:

  • GL_NEAREST_MIPMAP_NEAREST - 2 mintavételezés
  • GL_LINEAR_MIPMAP_NEAREST - 5 mintavételezés
  • GL_NEAREST_MIPMAP_LINEAR - 5 mintavételezés
  • GL_LINEAR_MIPMAP_LINEAR. - 8 mintavételezés

Némely esetnek létezik közkeletű neve is. A GL_LINEAR eset másik neve (mipmap nélküli)bilineáris szűrés. A GL_LINEAR_MIPMAP_NEAREST másik neve (mipmap-elt) bilineáris szűrés. A GL_LINEAR_MIPMAP_LINEAR közkeletű neve pedig a trilineáris szűrés.

Megjegyzendő, hogy a textúrák közötti szűrés bár általában sok mintavételezést igényel mégis gyorsabb a mai GPU-kon, mint a textúrák közötti szűrés nélküli megoldások. Ennek az a fő oka, hogy az esetek nagy hányadában egy kisebb textúrából kell mintavételeznie a TMU-nak.

Alapesetben minden bilineáris szűrés azonos távolságokból történik vagyis a textúra minden területe egyenletes szűrés alá kerül, amely sokszor nem kívánatos látványt nyújt. Ezt a hibát hivatott javítani az anizotróp szűrés, amely független az előzőektől és implementáció függő a megvalósítása. A technika lényege, hogy a szomszédok mintavételezéséhez adaptívan választja meg a szűrési távolságokat.

A legszebb textúraszűrés beállításához a nagyítást GL_LINEAR-ra, kicsinyítést GL_LINEAR_MIPMAP_LINEAR-ra, az anizotróp szűrést maximumra érdemes állítani.

Második menetben a speciális textúra esetekkel fogok foglalkozni. Az egyik a NPOT méretű textúra és a mélységi textúra.

 

Szólj hozzá!

Címkék: npot tmu texture addressing texture filtering anizotróp trilineáris bilineáris

3D engine felépítés - fától az erdőt... 2

2009.11.28. 17:21 :: syam

Rengeteg idő telt el a post elődje óta és számos tapasztalattal lettem gazdagabb. Az előző postban írtam néhány szót játéktörténelemről, amelyben - így utólag - egy nagy hiányosság fedezhető fel.

Elég belegondolnunk, hogy "régen" a CPU-k teljesítménye töredéke volt a mai "átlaghoz" (2 GHz) képest, nem létezett 3D gyorsítókártya és az a 200-300 MHz elég volt egy egész, működő 3D játékhoz (a pályák mérete, töltések száma már más kérdés). Már akkor is igyekeztek (nagy) hangsúlyt fektetni a látványra, ami - még ma is - igen erőforrás igényes sőt gyakran ez jelenti a szűk keresztmetszetet. Egyedüli megoldás a megjelenített objektumok ill. effektusok számának csökkentése. Az előbbi megoldást három lépésre bonthatjuk:

  1. igyekszünk minden nem látható objektumot kihagyni a megjelenítésből
  2. a megjelenített objektumot részletességét csökkenteni
  3. kevesebb számú objektumot megjeleníteni.

A 3. eset a legrosszabb - ilyen esetben a látványból sajnos sokat veszítünk. A 2. esetet geometriai LOD-nak hívják. Ebben az esetben akár minőségvesztés nélkül is növelhetjük a sebességet figyelembe véve azt a tényt, hogy a minél távolabbi egy objektum annál kevesebb részletet látunk belőle. Az 1. esethez érdemes segítségül hívnunk a térfelosztó módszereket.

A nagy hiányosságom pedig az volt, hogy ezek közül kifelejtettem a portálokat, amelyek a leginkább alkalmasak a zárt terekhez és amelyeket már a legelső játékok alkalmaztak bizonyos formában és mindmáig a leghatékonyabb technikák egyike.

Megjegyzendő, hogy nyílt tereknél az 1. eset sosem érvényesül hiszen a látótérben szinte mindig mindent látunk ezért ilyenkor a 2. esetre kell hangsúlyt fektetni (lásd terep renderelés).

 

Szólj hozzá!

Címkék: portal lod térfelosztás

Quake4

2009.11.28. 14:51 :: syam

Régóta terveztem, hogy egy a közelmúltban megjelent játékot veszek górcső alá kiderítendő a mai grafikai követelményeket ill. technikákat. Erre a célra az idSoft Quake4 engine-je kínálkozott a legjobb választásnak. Az elemzés egy NVidia QuadroFx570M-n készült tehát amennyiben vendor/driver specifikus részei vannak az engine-nek, akkor az elemzés csak erre a GPU-ra vonatkozik (egyik legjobb példa a kétoldalas stencil vizsgálat - Ati kártyák más néven nem támogatják ezt).

Geometriai jellemzők:

Az engine minden vertex adatot VBO-zik míg a vertex indexeket nem! Minden frame elején a szükséges adatokat feltölti a video memóriába. Úgy tűnik, hogy az animálást CPU oldalon végzi.

A vertex attributumokat a megszokott komponensszámmal (position - 3, texcoord - 2, TBN - 3x3, color - 4) és formátumban (color - unsigned byte, minden más - float) adja át. A vertex indexek mindig GL_UNSIGNED_INT.

Furcsa módon keveri a régi és új pipeline-t vagyis a position attribútumokat glVertexPointer hívással adja meg míg a többit glVertexAttribPointerrel.

Minden geometriát GL_TRIANGLES-ként renderel.

Az átlagos háromszög szám 30 000 - 130 000 között váltakozik, de ebben szerepel a shadow volume geometriája is és a multipass fázisok is! Külső terek megjelenítésekor általában 100 000 felett van az érték.

Gyakorlatilag nem használja a beépített mátrix kezelő parancsokat csak glLoadMatrixf-t. Nem használ glBegin/glEnd párost a rendereléshez.

Használja a három fontosabb mátrixot módot.

Raszterizálási jellemzők:

Rengeteg decalt renderel glPolygonOffset(0, -600) beállítás mellett.

Bump map rendereléskor 7 textúrát használ: diffuse maphez, normal maphez, specular maphez, egy projektív textúrát, kétféle gradient maphoz és egyet a normalizáló cube maphez.

Furcsa módon ebben a szakaszban is használja a régi pipeline-t -gyaníthatóan a HUD és decalok renderelésekor. A renderelés végén lehet találkozni texture environment combiner parancsokkal.

Az új pipeline-t GLSL-en (ezt leginkább bizonyos decalokhoz) és asm-on keresztül használja vegyesen.

Sok esetben akár 16 környezeti változót is átad a vertex programnak míg fragment programnak általában 2-t.

Érdekesség, hogy a depth range-t sokszor állítja: 0,1 ill. 0, 0.5 az előforduló értékek.

Árnyék renderelés:

Az árnyékterek renderelésekor használ polygonoffsetet 0,1 paraméterekkel.

Kihasználja a GL_EXT_stencil_test_two_side (ehhez kötelezően a GL_STENCIL_WRAP-et) valamint a GL_EXT_depth_bounds_test extensiont ill. a scissor test-et.

Úgy tűnik, hogy az árnyéktér sziluettjét és a szükséges geometriát a CPU-val állítja elő míg a fény irányának megfelelő kihuzást GPU-val végezteti és a végtelenbe vetíti az árnyéktér távoli végeit.

A térfelosztás alapján rendereli az árnyékokat: először az árnyékterek aztán a látható geometria.

A helyzetnek megfelelően használ z-fail és z-pass algoritmust.

Shadow map használatára utaló jeleket sehol nem találtam, csak egyszerű textúra projekcióra.

Egyéb:

A portálok renderelésekor is használ scissor testet. A háttérhez skybox-ot használ, amely függőleges irányban rövidebbnek tűnik, mint a szélessége. Úgy látszik, hogy a részecskerendszereket nem szűri engine, hanem mindig rendereli.

Végezetül jöjjön néhány negatívum.

Rengeteg textúra váltás. Rengeteg pointer váltás. Rengeteg állapot váltás. A vertex attributumok összefésülésének hiánya (különösen a statikus esetekben). Sok feleslegesnek tűnő utasítás - egymás után kiadott glLoadMatrix, glActiveTextureARB stb. parancsok. Elméletileg a régi (glVertexPointer és társai) és új típusú (glVertexAttribPointer) vertex attribútum átadást nem lehet keverni pontosabban nem kötelező az OpenGL implementációknak támogatnia.

 

Szólj hozzá!

Címkék: quake4 scissor test idsoft vbo decal polygon offset normalizáló cube map texture environment combiner shadow volume skybox ultra shadow 1 2

álljunk meg egy szóra

2009.06.11. 21:43 :: syam

Egy számítástechnikai előadás egyik diájának szövege:

Intel Centrino Duo Mobile Technology új kulcs featúrái

  • Intel Core Duo processzor, az Intel első mobil-optimalizált duál-core processzora, amely multiplikált threadeket képes szimultán executálni a két core-ban, amivel maximális performanciát és még jobb multitaszkolási képességeket érhetünk el.
  • Intel Digital Media Boost gazdag multimédia experiancát nyújt az enhanszolt floating pointos műveleteknek köszönhetően.
  • Az Intel Smart Cache shared L2 segítségével a full cache hozzáférhető még akkor is, ha csak az egyik core aktív, ezen kívül minimalizálja a bus trafficot, valamint a cache complexitásának redukálásával a powert is save-eli.

Hát nem csodálatos a magyar nyelv rugalmasságát ilyen mértékben kihasználó mondathalmazon legeltetve szemünket eltöprengeni azon, hogy mi mindent képes létrehozni az emberi agy gondolatait átfűzve angol nyelvű kifejezéseken azért, hogy létrehozzon egy átlagember számára szinte teljesen értelmetlen szóhalmazt, ami ráadásul még furcsán is hangzik.

Szólj hozzá!

telik a jesítmény

2009.06.06. 20:36 :: syam

Miközben a fények kezelésén agyaltam a mai nap bevillant egy gondolat, miszerint teljesítményt kellene mérnem az engine-mmel. Vagyis melyik függvényben tölti a cpu az idejét leginkább. A mérést debug módban végeztem.

A mainloop:

  1. A swapbuffers végzett első helyen kb 87%-kal, ami ugye nem más, mint a renderelés kb 99%a.
  2. Második helyen az advance nevű függvényem szerepel közel 7%-kal.
  3. A dobogó utolsó helyére egy titokzatos unknown függvény került 3%-kal.
  4. A negyedik helyet a render szerezte meg a maga 1,6 %-ával.
  5. Az ötödik helyen az input lekérdezése áll 0.3%-kal.

Most vesézzük ki az advance függvényt.

  1. Na most jön a meglepetés: 80%-kal a NpGetPhysicsSDK nevezetű függvény viszi a pálmát.
  2. Második helyen a scenegraph-ban mozgatást végző függvény áll szerény 8.2%-kal.
  3. Harmadik helyen a szereplők tevékenységéért felelős Do függvény áll 6,5%-kal
  4. A negyedik helyre az aktív szereplők scenegraph-ban elvégzett műveleteit végrehajtó függvény jutott kerek 4,9%-kal.

Nézzük mit rejt a 2. helyen végzett függvény:

  1. Az első helyen a scenegraph csomópontjait aktivizáló függvény van, de mindössze 54%-kal!
  2. A második helyen 46%-kal a free függvény áll.

Ez a free függvény eredetileg egy delete operátor volt és akkor az arányok is mások voltak: első helyen a delete operátor állt 57%-kal a második helyre szorítva a "lényeges" függvényt...

Vessünk közelebbi pillantást a Do függvény mélyére, ahol a szereplőnek update függvénye található:

  1. Első helyen a fizikai test információit lekérdező függvény végzett 41%-kal, amelyben 100%-ot egy NxMat34 utasítás visz el. Gyanítom ezt is érdemes lenne lecserélni....
  2. Második helyre ismét egy egzotikum került NxCreateCoreSDK névvel. Ő szerény 30%-ba kerül.
  3. Az utolsó két helyre sikerült felkapaszkodnia két saját matematikai függvényemnek is 17 és 11%-kal.

Utoljára az utolsó függvénybe ássuk bele magunkat:

  1. 76%-kal az aabb-aabb átfedést vizsgáló művelet nyert, ami nem meglepő.
  2. Második helyen viszont egy kivonás(!) végzett 17%-kal.
  3. A harmadik helyre pedig egy értékadás került.

Az advance függény után vessünk még egy futó pillantást a renderelésre:

Itt az aranyérmes a frustum cull lett 77%-kal, a többi idő a renderelésre fordítódik. A frustum cullból pedig 91% aabb aabb átfedés vizsgálatban telik el.

Valószínűleg sikerült megtalálni a sebességkritikus kódrészeket, amelyeken -ha lehet- érdemes tovább optimalizálni.

 

Szólj hozzá!

az uj hlsl korszak

2009.06.06. 10:51 :: syam

Hát eljött ez az idő is 2008-ban...

HLSL 5.0 OOP / Dynamic Shader Linking

Valaki mondja meg miért... Valaki szeretne objektum orientáltan mátrixokat szorozni? Vagy amit lusta voltál megírni, most mások megírták helyetted?

 

Szólj hozzá!

süti beállítások módosítása
Mobil