.[ ČeskéHry.cz ].
3D Teren z výškové mapy
Jdi na stránku Předchozí  1, 2
 
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
VladR



Založen: 30. 07. 2007
Příspěvky: 1322
Bydliště: Greater New York City Area

PříspěvekZaslal: 7. říjen 2008, 08:59:08    Předmět: Odpovědět s citátem

Nejak ste sa tu rozbehli minuly tyzden Smile

ad 500 MB : Postni sem ako vyzera tvoj vertex a aky velky IB pouzivas.
Kludne tam mozes mat nieo sprasene, co spotrebu pamate duplikuje, ale to si uz musis oddebugovat ty. Zacni to krokovat po troche a sleduj kedy ti spotreba vybehne.

Dalej, nemozes merat spotrebu tak, ze pozries task manazer. Odmeraj si to v kode, kolko ti to pole zabera. Dufam, ze to nie je <vector> a nereziduje cely cas v pamati aj po vytvoreni VB.

Pokial chces znizit spotrebu pamate terenu, tak najlepsia volba je pouzit Base Chunk a 2 streamy. Base Chunk obsahuje predratane XZ pozicie a UV(UV2) kazdeho vertexu. Tieto data su spolocne pre kazdy jeden chunk celeho terenu (samozrejme, musi byt teren podeleny na tieto chunky). To je Stream 0. Samotnu vysku vertexu potom mas v Stream1. Tym padom potrebujes iba 4 Bytes na vertex, co aj pri 1024x1024 cini len 4 MB. Velkost Base Chunk VB je zanedbatelna, lebo pri 128x128 zabera len okolo 0.5 MB. Oba streamy skombinujes vo vertex shaderi.

Este viac ide znizit spotrebu, ak heightmapu konvertnes do DXT1 (a patricne upravis shader). Potom ti zaberie len 0.5 Bytes na vertex vo VRAM, co je bezkonkurencne.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Juraj



Založen: 06. 12. 2007
Příspěvky: 189

PříspěvekZaslal: 7. říjen 2008, 09:11:23    Předmět: Odpovědět s citátem

Tak po drobném odmlčení jsem zase tu.

Ano jelikož je to stále mnou přepracovávaný terén z nějakého tutigu, je možné že zde mám více údajů zbytečně. Nyní to mám tak rozvrtané že mi terrén ani nenaběhne Smile. Ale jakymle se dostanu k tomu slavnému rozčvetcování, debugnu to a podívám se na formát vertex bufferu.

Přikládám strukturu, aby jste to mohli odborný okem zkouknout, jak říkám je to ještě stále podle tutigu, takže tam bude asi více zbytečných věcí které by snad šli vypočítat v sharderech při renderu.
kód:

    Structure TerrainVertex
        Dim pos As Vector3
        Dim normal As Vector3
        Dim tiledTexC As Vector2
        Dim nonTiledTexC As Vector2
    End Structure
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VladR



Založen: 30. 07. 2007
Příspěvky: 1322
Bydliště: Greater New York City Area

PříspěvekZaslal: 7. říjen 2008, 09:36:54    Předmět: Odpovědět s citátem

Cize 40 Bytes na vertex. To sa uz celkom rychlo nascita.

Ak budes potrebovat normalu na kazdy vertex a nechces to riesit cez normalovu mapu, tak aspon pouzi half, cim znizis spotrebu na 50%. Az budes mat spravene aj shadery, tak pouzi iba 1 Byte na kazdy koordinat normaly, cim sa dostanes na 25% spotreby (3 vs 12). Pokial sa ti 1 Byte zda malo oproti 4, tak si predstav, ze aj ten 1 byte na koordinat ti da 16.7 mil. roznych normal, co je akoze stale zbytocne vela.
Ja ak potrebujem normaly, tak ich spakujem do 2 Bytov, resp. si vypomozem nejakym inym bitom v inych vertexovych datach. 18 bitov na nx,ny,nz staci v pohode.
To len, az sa budes nudit a budes citit silne nutkanie s tou spotrebou RAM nieco spravit Very Happy
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Juraj



Založen: 06. 12. 2007
Příspěvky: 189

PříspěvekZaslal: 7. říjen 2008, 11:20:06    Předmět: Odpovědět s citátem

Jasně že tu potřebu mam Smile

Nyní však musím kompletně dodělat zobrazení terénu podle kamery, co mi dalo celkem zabrat to vše rozdělit a poté se vrhnu na snížení potřeby ram..

Jen tak pro zajímavost je rozdíl jeslti používám třeba na nromálu Vector3, nebo bych mel x,y,z as byte? Já si myslím že ano, protože byte ma nižší maximum a tudíš by měl zabírat méně paměti.. Ale zase jsem někde četl, že .NET pracuje tak že dinamicky zvětšuje přidělenou pamět podle obsahu proměné. Víte někdo jak to je?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VladR



Založen: 30. 07. 2007
Příspěvky: 1322
Bydliště: Greater New York City Area

PříspěvekZaslal: 7. říjen 2008, 14:06:40    Předmět: Odpovědět s citátem

Tak to si pis ze je rozdiel medzi velkostou Byte a float Rolling Eyes Obvykle 4:1. Druha vec je, ze to v RAM musi byt nejako zarovnane, netusim ci to ide vypnut vo Visual Basicu (s neprijemnym dopadom na vykon, pravdaze).
Vid : http://msdn.microsoft.com/en-us/library/83ythb65(VS.80).aspx

Potom, ked vytvaras Vertex Buffer, tak tam tiez kazdy komponent musi byt nasobkom 4, cize aj ked pouzivas iba 3 byty, tak fyzicky zaberas vo VRAM 4 (ale potom vies ten volny pouzit na cokolvek ine, podla potreby).

Pravdaze, nestaci ti toto zmenit len tak, v deklaracii vertexu, na to musis mat nakodeny shader, ktory ti danu hodnotu 0-255 transformne do patricneho rozsahu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 7. říjen 2008, 14:38:26    Předmět: Odpovědět s citátem

Juraj napsal:
Ale zase jsem někde četl, že .NET pracuje tak že dinamicky zvětšuje přidělenou pamět podle obsahu proměné. Víte někdo jak to je?


To asi ne. Standardní typy (Int32, Int64 atd.) budou fixní. Je možné, že .NET poskytuje nějakou číselnou třídu, která dokáže uložit libovolně velké číslo (a ta se tedy bude dynamicky zvětšovat/zmenšovat). Pro všechny číselné typy to ale neplatí.
_________________
Mám strach
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VladR



Založen: 30. 07. 2007
Příspěvky: 1322
Bydliště: Greater New York City Area

PříspěvekZaslal: 7. říjen 2008, 15:12:18    Předmět: Odpovědět s citátem

Ci on nahodou nema na mysli typ decimal ? Alebo to, ze kontajner sa dokaze dynamicky realokovat, ak sa do neho pridavaju elementy. To by musel jasnejsie popisat.
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: 7. říjen 2008, 15:27:13    Předmět: Odpovědět s citátem

No ale hlavně já bych data (pokud s nima nepotřebuje pracovat na CPU) vůbec netahal přes nějaký svoje struktury vertexů, ale rovnou je zapisoval do vertex bufferu. Tzn. v nějakýho formátu si přečtu jeden vertex a ten hned strčim (patřičně upravenej) do vertex bufferu. Maximálně to dělat po nějakých chunkách, ale rozhodně ne nejprve natáhnout celé do paměti a překlopit do vertex bufferu. I když vlastně to by ani nemuselo tolik vadit...ale hlavně proboha si pak to pole vertexů nedržet, ale uvolnit ho!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Crusty



Založen: 28. 08. 2007
Příspěvky: 120
Bydliště: Praha

PříspěvekZaslal: 7. říjen 2008, 18:59:28    Předmět: Odpovědět s citátem

mno ale neni to zas na ukor vykonu porad ty VB nacitat a mazat ?
_________________
http://www.2ox.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



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

PříspěvekZaslal: 7. říjen 2008, 19:05:58    Předmět: Odpovědět s citátem

ak je raz vertex buffer vytvoreny tak ostane dostupny az dokym ho neuvolnim alebo este nestratim kontext. takze drzat si tie data v pameti je zbytocnost.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Juraj



Založen: 06. 12. 2007
Příspěvky: 189

PříspěvekZaslal: 13. říjen 2008, 10:34:39    Předmět: Odpovědět s citátem

Tak abych se taky pochlubil, dal jsem se do první fáze optimalizace vertex bufferu. Strukturu jsem zjednodusil a potrebne hodnoty vypocitavam privo v sharderech..

aktuální struktura
kód:
Structure TerrainVertex
        Dim pos As Vector3
        Dim normal As Vector3
End Structure


Dále jsem porvedl přepočet VB, zmenšení počtu trojúhelníků v méně zakřivených částech terénu.

Moje nynejší RAM aplikace je 240MB, tož z původních 600MB je opravdu úspěch Very Happy.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Juraj



Založen: 06. 12. 2007
Příspěvky: 189

PříspěvekZaslal: 13. říjen 2008, 16:35:45    Předmět: Odpovědět s citátem

Augi napsal:
No ale hlavně já bych data (pokud s nima nepotřebuje pracovat na CPU) vůbec netahal přes nějaký svoje struktury vertexů, ale rovnou je zapisoval do vertex bufferu. Tzn. v nějakýho formátu si přečtu jeden vertex a ten hned strčim (patřičně upravenej) do vertex bufferu. Maximálně to dělat po nějakých chunkách, ale rozhodně ne nejprve natáhnout celé do paměti a překlopit do vertex bufferu. I když vlastně to by ani nemuselo tolik vadit...ale hlavně proboha si pak to pole vertexů nedržet, ale uvolnit ho!


Jeste jsem to nehledal, takže to možná bude jen prkotina, ale radši se zeptám. Jak se dá vertex Buffer plnit po jednotlivých vertexech? Zatím jsem použil pouze metodu setData() kde mu předám celé pole. Nevím však zda jde nějak přidávat do vertex Bufferu, např. po jednotivách vertexech, pokud ano jak?
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: 13. říjen 2008, 17:35:52    Předmět: Odpovědět s citátem

Panebože, VertexBuffer v MDX má asi pět metod - to je vážně problém se na ně podívat? Pokud ano, tak věz, že lockování vertex bufferu tak, že je k němu pak přístup jako ke streamu, zajišťuje dvojice metod Lock a Unlock:
http://msdn.microsoft.com/en-us/library/microsoft.windowsmobile.directx.direct3d.vertexbuffer_methods.aspx
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 17. říjen 2008, 17:41:47    Předmět: Odpovědět s citátem

Augi napsal:
No ale hlavně já bych data (pokud s nima nepotřebuje pracovat na CPU) vůbec netahal přes nějaký svoje struktury vertexů, ale rovnou je zapisoval do vertex bufferu. Tzn. v nějakýho formátu si přečtu jeden vertex a ten hned strčim (patřičně upravenej) do vertex bufferu. Maximálně to dělat po nějakých chunkách, ale rozhodně ne nejprve natáhnout celé do paměti a překlopit do vertex bufferu. I když vlastně to by ani nemuselo tolik vadit...


Ono by se to dalo řešit možná trochu líp. Za předpokladu, že mám stream v souboru přesně tak, jak ho chci na GPU, stačilo by jen:
1) otevřít soubor modelu, zjistit si potřebnou velikost vertex bufferu
2) vytvořit ho a locknout
3) přečíst celej úsek souboru rovnou do něj
4) unlock

Tady je akorát už potřeba si navrhnout vlastní formát modelů. Alespoň teda neznám formát, co by uložil stream do souboru přesně tak, jak chci. To samý jde i s texturama (aspoň v GL), tam je to myslím ještě užitečnější, protože textur je obecně daleko víc, a formát na to už máme - DDS.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
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 Předchozí  1, 2
Strana 2 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