.[ ČeskéHry.cz ].
Engine a univerzálnost - hlavně správa scény (stromy atd)
Jdi na stránku 1, 2  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 10. březen 2010, 20:31:56    Předmět: Engine a univerzálnost - hlavně správa scény (stromy atd) Odpovědět s citátem

Píšu si malý engine Smile a snažím se aby byl hodně "variabilní".

Momentálně mám na radu Sema sepsaný scene management (už se to tu jednou řešilo).

Např. mám CollisionManager, který obstarává veškeré kolize modelů ve scéně. Obsahuje (zatím pouze lineárně) seznam objektů Collision (každý model má přiřazen právě 1 nebo žádný kolizní objekt, který se skládá z nekonečného množství bounding boxů nebo čehokoliv jiného)
Nebo GraphicsManager se stará o vizuální složku, AIManager se stará o AI atd.

Mám pár dotazů:
1) je lepší aby měl každý model svůj vlastní VertexBuffer, nebo je lepší udělat něco jako pole VertexBufferů (pro každý typ vertexů jeden VB v poli) a mít je globálně a model by si držel pouze index na vertex buffer v poli a offset. Takže bych ušetřil přepínání vertex bufferů při kreslení (co jsem četl, tak přepínání VB něco stojí)
2) Momentálně mám všechny objekty zarovnané na mřížku (takže třeba zeď vyplní 1 buňku a ta má true / false). Přijde mi to nějaké pochybné Very Happy, ale zase se s tím v AI "dobře" pracuje... zajímalo by mě, jak se řeší tohle v reálných aplikacích... moc mi nepřijde, že by všechno bylo zarovnané na mřížku (nějaké kulaté budovy apod)
3) Mám budovy ve městě. Momentálně to mám udělané tak, že 1 typ budovy (třeba panelák) je 1 objekt a instací ho vykreslím třeba 100x... jenomže pak mám v jeho kolizní třídě nacpáno 100 bounding boxů ve spojáku. Když udělám zase každou budovu jako 1 objekt, tak to "zabiju" množstvím objektů (s tím že budovy lze libovolně bourat, takže instancování mi přijde jako dobrý nápad.. na grafiku posílám akorát pozice, tangenty, normály, binormály, apod. už jse tam nahrané)

To by bylo pro zatím vše Smile Díky za názory.... nejde o nic kritického, jen mi to tak zajímá. Když už něco dělám, ať nedělám nějakou čuňačinu, kterou pak budu muset stejně přepsat, protože se to nebude "hýbat"


Naposledy upravil perry dne 6. duben 2010, 09:26:00, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 10. březen 2010, 21:32:56    Předmět: Re: Engine a univerzálnost Odpovědět s citátem

perry napsal:
Např. mám CollisionManager, který obstarává veškeré kolize modelů ve scéně. Obsahuje (zatím pouze lineárně) seznam objektů Collision (každý model má přiřazen právě 1 nebo žádný kolizní objekt, který se skládá z nekonečného množství bounding boxů nebo čehokoliv jiného)
Nebo GraphicsManager se stará o vizuální složku, AIManager se stará o AI atd.
To vypadá rozumně. Ale nepíšeš o vzájemném vztahu těhle managerů, což je docela důležité. Já bych to měl asi udělané tak, že by byl nějaký Game Engine, který by obsahoval po jedné instanci od každého z managerů.
V Game enginu bych měl dále GameObjecty, které by mohli mít odkazy na objekty vyrobené v různých managerech. Např. GameObject typu Car by obsahoval odkaz na GraphicsObject, CollisionObject a AIObject. Tyhle GameObjecty by tak zároveň mohly řešit synchronizaci mezi jednotlivými "světy" (hlavne mezi fyzikálním a grafickým) - jednoduše pokud se změní pozice objektu Car.CollisionObject, tak se automaticky změní pozice objektu Car.GraphicsObject.
Jak to řešíš Ty? Já to nikdy takhle neimplementoval, tak mi možná něco uniká...ale působí to na mě jako docela pěkné řešení.


perry napsal:
1) je lepší aby měl každý model svůj vlastní VertexBuffer, nebo je lepší udělat něco jako pole VertexBufferů (pro každý typ vertexů jeden VB v poli) a mít je globálně a model by si držel pouze index na vertex buffer v poli a offset. Takže bych ušetřil přepínání vertex bufferů při kreslení (co jsem četl, tak přepínání VB něco stojí)
Nooo, po pravdě mě tohle řešení nikdy nenapadlo, načítat všechno do jednoho vertex bufferu. Vlastně by ani nemuselo možná vadit, že tam budeš mixovat vertexy s jinou strukturou. Ale nevím, jestli se nestane jeden jediný vertex buffer úzkým hrdlem, když se bude grafická karta snažit paralelizovat. To je tak jediné proti, které mě v tuhle hodinu napadá Smile


perry napsal:
2) Momentálně mám všechny objekty zarovnané na mřížku (takže třeba zeď vyplní 1 buňku a ta má true / false). Přijde mi to nějaké pochybné Very Happy, ale zase se s tím v AI "dobře" pracuje... zajímalo by mě, jak se řeší tohle v reálných aplikacích... moc mi nepřijde, že by všechno bylo zarovnané na mřížku (nějaké kulaté budovy apod)
Tohle jsme už nakousl v úvodu - de facto máš ve hře několik paralelních provázaných světů - grafický svět (co renderuješ), svět kolizních objektů a svět AI (často stejný jako svět herní logiky). Záleží na typu hry - pokud děláš Sokobana, tak asi zarovnání na mřížku vadit nebude Smile Ale pokud to chceš mít obecněji, tak by to chtělo mít objekty libovolně pozicovatelné, tj. možnost mít objekt kdekoliv a jakkoliv natočený. Samozřejmě třeba vypočítat pak třeba kolize mezi libovolně natočenými objekty není sranda, ale od toho tu máme fyzikální/kolizní enginy, kde je to už všechno vyřešené.
Aby byly ale tyhle algoritmy efektivní, je třeba často objekty nějak třídit v prostoru, např. pomocí Quadtree, Octree nebo pomocí nějakých obecnějších hierarchicky obalujících objektů...


perry napsal:

3) Mám budovy ve městě. Momentálně to mám udělané tak, že 1 typ budovy (třeba panelák) je 1 objekt a instací ho vykreslím třeba 100x... jenomže pak mám v jeho kolizní třídě nacpáno 100 bounding boxů ve spojáku. Když udělám zase každou budovu jako 1 objekt, tak to "zabiju" množstvím objektů (s tím že budovy lze libovolně bourat, takže instancování mi přijde jako dobrý nápad.. na grafiku posílám akorát pozice, tangenty, normály, binormály, apod. už jse tam nahrané)
V duchu mého úvodního slova (Wink) bych to udělal tak, že bys měl 100 instancí GameObjectu typu Budova - všechny instance by obsahovaly odkaz na tentýž grafický objekt reprezentující dům (takže bys měl geometrii na grafické kartě jen jednou) a každý GameObject by obsahoval vlastní instanci kolizního objektu (tedy těch 100 bounding boxů).
Ty to děláš de facto tak, že máš jakoby GameObjekt typu Budovy (množné číslo), kde máš jeden grafický objekt a více kolizních objektů. To je také dobrý přístup, navíc Ti umožní snadno implementovat instancing (technika renderingu více stejné geometrie najednou).
Takže záleží, jaký přístup Ti momentálně vyhovuje, každý má své pro a proti.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 10. březen 2010, 21:57:51    Předmět: Odpovědět s citátem

Díky za odpověď

citace:

Tyhle GameObjecty by tak zároveň mohly řešit synchronizaci mezi jednotlivými "světy" (hlavne mezi fyzikálním a grafickým) - jednoduše pokud se změní pozice objektu Car.CollisionObject, tak se automaticky změní pozice objektu Car.GraphicsObject.
Jak to řešíš Ty? Já to nikdy takhle neimplementoval, tak mi možná něco uniká...ale působí to na mě jako docela pěkné řešení.


Všechny objekty (Graphics, Collision, AI) vidí zároveň na všechny ostatní daného modelu. (Takže AI má přístup k pozici, kolizím daného modelu + u AI mám přístup ke všemu ve scnéně přes managary)
Dělané je to tak, že mám abstract class SharedProperties, tu extendují všechny ostatní vlastnosti objektu a obsahuje pointery na ostatní třídy Smile je to trochu zamotany Smile
Vlastně collisions mají odkaz tím pádem sami na sebe (na to se musí dát pozor, protože jinak by se to zacyklilo... )
Finální funkčnost se chová tak, jak jsi psal
citace:

pokud se změní pozice objektu Car.CollisionObject, tak se automaticky změní pozice objektu Car.GraphicsObject.

akorát s tím, že Car.GraphicsObject si pozici nedrží, ale "sáhne" si pro ní do Car.Position. Car.CollisionObject pak když upravuje pozici, tak jí nastaví do Car.Position
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 11. březen 2010, 05:47:32    Předmět: Odpovědět s citátem

Jo, tak jsem to myslel, jen už jsem neměl sílu to rozepisovat, kdo drží pozici a kdo data Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 11. březen 2010, 08:58:14    Předmět: Odpovědět s citátem

K tomu jednomu velkýmu vertex bufferu mě napadá pár věcí:

1) Když nějaký objekt smažeš, vznikne v paměti díra. Tu můžeš přidělit jinýmu, novýmu objektu, ale pokud se tam nevejde, musíš alokovat jinde. Bude to prostě fragmentovaný. Třeba ale nebudeš chtít mazat objekty během hry.

2) Pokud budeš chtít některýmu objektu dynamicky updatovat geometrii, musíš locknout celý tento velký buffer, což může myslím dost zpomalit.

Na začátku píšeš, že chceš mít engine univerzální, hlasoval bych tedy proto, mít Vertex Buffery pro jednoduchost oddělené. Maximálně v nějakých speciálních případech - terén, statický objekty - implementovat sdílený vertex buffer přesně na míru daný situaci.

Napadá mě nakonec ještě jedno kompromisní řešení: mít sdílený vertex buffer v rámci jednoho "souboru". Dejme tomu, že v jednom 3D souboru budeš mít několik objektů, tak právě tyto objekty by mohly sdílet vertex buffer.
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 11. březen 2010, 09:28:21    Předmět: Odpovědět s citátem

citace:

Napadá mě nakonec ještě jedno kompromisní řešení: mít sdílený vertex buffer v rámci jednoho "souboru". Dejme tomu, že v jednom 3D souboru budeš mít několik objektů, tak právě tyto objekty by mohly sdílet vertex buffer.


Takhle to momentálně mám Smile A buď kreslím objekt po částech, nebo ho vyrenderuji na jeden draw call... s tím, že pak přijdu o některé sub rotace, ale např. pro stíny, vodu to stačí
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 11. březen 2010, 13:07:56    Předmět: Odpovědět s citátem

Ja sa mozem vyjadrit k akceleracnym strukturam, ktore proste budes potrebovat v pripade, ze sa chystas kreslit viac ako malo objektov Very Happy
V zasade mas 2 typy takychto hierarchickych struktur:
1) tie, ktore delia priestor (BSP strom, kD-strom, octree, uniform grid, ...)
2) tie, ktore delia objekty (Bounding Volume Hierarchy (BVH))
Ja ti odporucam naprogramovat si BVH, co ti podla mna do tvojho systemu pasuje najviac. Budes ho pouzivat na rapidne vyradovanie celych skupin objektov z vykreslovania -- tie, ktore sa nenachadzaju v pohlade nebudes kreslit. Ako hovorim, je jednoduchy na implementaciu, v porovnani s osatnymi dosahuje podobne vysledky a existuju aj sposoby ako ho stavat/updatovat nad dynamickymi objektami.
S tym samozrejme bude suvisiet aj struktura grafickych objektov, pretoze uz nebudes moct mat jediny draw call, kedze objekty/data budes musiet mat podelene v hierarchickej strukture.
Ak o tom chces viac, pytaj sa, lebo som nic este vlastne nepovedal Very Happy
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 11. březen 2010, 13:43:14    Předmět: Odpovědět s citátem

Nechci mít za každou cenu pravdu, ale myslím, že pro perryho architekturu se hodí spíš způsob 1) :-)
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 11. březen 2010, 14:59:57    Předmět: Odpovědět s citátem

Na BVH jsem už koukal ale nějak rozumně mi tam nezapadl... Respektive nad jedním objektem (třeba to město) by fungoval docela rozumně v tom jak to mám napsané, ale 1 BVH nad všemi objekty už tam asi nedostanu.

Skupina 1) je jak psal Semo pro mě použitelnější. Přemýšlel jsem o Quad-Tree, který už vlastně mám napsaný pro terén

Teď jsem narazil ještě na jednu "překážku"... jelikož mám budovy (a sbírací bonusy) jako instance, tak abych je mohl kreslit / nekreslit, tak bych pořád musel updatovat instanční VB.


----
Plus zase stíny (reps. ono to platí pro libovolné odrazy. třeba i zpětné zrcátko v autě) Smile Jak je ve finále "roztáhnout" přes všechny objekty ? Když terén, instance, modely mají každý jiný shader... když to vepíšu přímo do těch jednotlivých shaderů, tak to funguje, ale v některých případech mi dojdou registry a pak jsem skončil. Takže něco jako dorenderovat to jako druhý průchod do finální scény... prostě jeden shader který se aplikuje na celou hotovou scénu, jestli to jde...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 11. březen 2010, 15:10:18    Předmět: Odpovědět s citátem

Stíny:
můžeš to vykreslit jako druhý průchod do textury a tu pak přes fullscreen quad přiblendovat, ale je to naprd. Budeš mít třeba i ve stínu odlesk slunce, jen bude ztmavený. Udělej si nějakou univerzální funkci do shaderů a vejdi se do registrů :-).
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 11. březen 2010, 19:24:43    Předmět: Odpovědět s citátem

Jak do systému nahodit zvuky ? Vytvořit zase class SoundManager a každému objektu třídu sound ? Stejně jako Kolize, Grafika apod. ? Přijde mi to jako ideální... s tím že do toho pěkně zapadne i svět.. jako 1 z komponent
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 11. březen 2010, 19:44:14    Předmět: Odpovědět s citátem

Ano, proč ne. Tak sem to dělal taky. Respektive byl SoundEmitor + SoundBuffer. SoundEmitor je to, co je umístěný v prostoru a vydává zvuk, který je nahraný v SoundBuffer.

Koukám, že se to vlákno celý pěkně zvrhlo :-). Měli bysme přestat, nebo nám to tu někdo z moderátorů pěkně přemoderuje :)
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 11. březen 2010, 21:31:09    Předmět: Odpovědět s citátem

Jj, taky bych to udělal přesně takhle.

Semouši, myslím, že jsme ještě pořád hodně on-topic Very Happy
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 12. březen 2010, 17:58:13    Předmět: Odpovědět s citátem

Jak se řeší texture management ? Momentálně si je načtu do paměti a mam je v různých proměných. Ale občas začínám narážet (LostDevice - nepraktická obnova; 1 textura použití vicekrát - problém s přístupem k souboru atd.)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 12. březen 2010, 18:37:13    Předmět: Odpovědět s citátem

No řešil bych to tak, že bych měl pro jedno jméno souboru a nastavení načítání jednu instanci třídy Textura.
Aby se textura uvolnila vždy, když ji už nikdo nepotřebuje, tak je vhodný tam udělat např. nějaký počítání referencí. Jakože když dáš načíst soubor s nějakým nastavením (např. generování mipmap), tak si nejdřív zjistim, jestli pro tenhle soubor a tohle nastavení už neexistuje vytvořená textura. Pokud ano, tak pouze inkrementuju počet instancí té textury a vrátím již existující instanci. V opačném případě vytvářím novou instanci textury.

Při uvolňování je pak třeba pouze dekrementovat ten čítač. Když spadne na nulu, tak se může textura "fyzicky" odstranit z grafárny.

Ohledně Lost Device - pokud nepracuješ s nějakou DXTexture apod., ale máš obálku ve formě vlastní třídy a tu DXTexture si držíš uvnitř, tak to není problém. V případě lost device TextureManager pouze projde všechny instance textur a ošéfuje to.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna