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
|
Zaslal: 7. říjen 2008, 08:59:08 Předmět: |
|
|
Nejak ste sa tu rozbehli minuly tyzden
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 |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 7. říjen 2008, 09:11:23 Předmět: |
|
|
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 . 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 |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 7. říjen 2008, 09:36:54 Předmět: |
|
|
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  |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 7. říjen 2008, 11:20:06 Předmět: |
|
|
Jasně že tu potřebu mam
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 |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 7. říjen 2008, 14:06:40 Předmět: |
|
|
Tak to si pis ze je rozdiel medzi velkostou Byte a float 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 |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 7. říjen 2008, 14:38:26 Předmět: |
|
|
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 |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 7. říjen 2008, 15:12:18 Předmět: |
|
|
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 |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 7. říjen 2008, 15:27:13 Předmět: |
|
|
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 |
|
 |
Crusty
Založen: 28. 08. 2007 Příspěvky: 120 Bydliště: Praha
|
Zaslal: 7. říjen 2008, 18:59:28 Předmět: |
|
|
mno ale neni to zas na ukor vykonu porad ty VB nacitat a mazat ? _________________ http://www.2ox.cz |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1051
|
Zaslal: 7. říjen 2008, 19:05:58 Předmět: |
|
|
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 |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 13. říjen 2008, 10:34:39 Předmět: |
|
|
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 . |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 13. říjen 2008, 16:35:45 Předmět: |
|
|
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 |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 17. říjen 2008, 17:41:47 Předmět: |
|
|
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 |
|
 |
|