.[ ČeskéHry.cz ].
DirectX - jak je to s pameti u vertexbufferu?

 
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
xtopi



Založen: 11. 08. 2007
Příspěvky: 24
Bydliště: La republica Checa

PříspěvekZaslal: 20. září 2007, 00:22:08    Předmět: DirectX - jak je to s pameti u vertexbufferu? Odpovědět s citátem

Nerozumim tomuhle, kdyz si vytvorim vetexbuffer takhle jednoduse:
kód:


struct CustomVertex {
   float x, y, z;
};     // sizeof() = 12

DWORD myfvf = D3DFVF_XYZ;

VertsCount = 1000000; // 1 milion
...

pd3dDevice->CreateVertexBuffer( VertsCount * sizeof(CustomVertex), D3DUSAGE_WRITEONLY, myfvf, D3DPOOL_DEFAULT, &pVB, NULL );


v pripade, ze pocet vertexu je milion, a struktura vertexu zabira 12 bajtu, vychazi mi ze cisty data maji 12MB, ale kdyz si zobrazim spravce programu ve WinXP, tak aplikace zabira 320MB (jinak bez tohohle kodu zabira cca 80MB). Prece nemuze bejt takova rezije na par mega dat. Nebo mi neco unika? :-/

ps: jde o visual c++ express
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: 20. září 2007, 09:16:08    Předmět: Odpovědět s citátem

Tohle záleží na více faktorech. Ale protože jsi při vytváření vertex bufferu uvedl flag D3DPOOL_DEFAULT, očekával bych, že data vertex bufferu budou uložena přímo na grafické kartě. Nezabírají Ti v paměti tolik místa vertexy, které máš uložené v paměti a které pak kopíruješ do toho vertex bufferu? Ohledně zabrané paměti také může hrát roli to, že velikost vertexu není mocnina dvou (z důvodu zarovnání).
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: 20. září 2007, 14:55:19    Předmět: Odpovědět s citátem

320MB je fakt trochu moc, nekde je neco strasne spatne. Wink Nemas treba Intel kartu nebo neco takovyho?
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crusty



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

PříspěvekZaslal: 20. září 2007, 17:44:24    Předmět: Odpovědět s citátem

.. mno jo ale jeste taky nevime co dela jineho v tom programu, jestli to spousti jako debug v kompilatoru, atd
_________________
http://www.2ox.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
xtopi



Založen: 11. 08. 2007
Příspěvky: 24
Bydliště: La republica Checa

PříspěvekZaslal: 20. září 2007, 17:59:52    Předmět: Odpovědět s citátem

tak se omlouvám, chyba je u mě... Smile

taky jsem si myslel, že díky D3DPOOL_DEFAULT "zaberu" paměť na grafárně, a asi to tak nakonec bude, protože pokud jen tak vytvořím vertex buffer, tak se paměť ve správci úloh ani nehne, i když počet bodů je 10milionů, ale paměť se začne alokovat až při renderování (při 10mil.bodech zabere přes 1GB). Zatím nevím kde je chyba....

edit:
je to v debug, ale i v release volne spusteny to zabira stejne 320MB pri vertexbufferu o 1mil bodech. zjistil jsem, ze to dela funkce DrawIndexedPrimitive, kdyz ji zakomentuju (nic se nevykresli, ale jinak vse bezi stejne), tak aplikace nezabira nic, nevim cim to je.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 21. září 2007, 10:13:50    Předmět: Odpovědět s citátem

ukaz ten kus kodu s DrawIndexedPrimitive
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



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

PříspěvekZaslal: 21. září 2007, 11:38:22    Předmět: Odpovědět s citátem

To je celkem logicky - gpu a mozna i cast driveru pracuje asynchrone a je mozny, ze do ty doby si jenom pripravuje frontu prikazu a pri DrawIndexedPrimitive to odesle na gpu nebo to jeste nejak zpracovava. To plati jen pro prvni snimek. Nahodou jsem zjistil, ze stejne se to chova u glDrawElements v GL. Ale proc to zabira tolik pameti, to je pro me zahada.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
xtopi



Založen: 11. 08. 2007
Příspěvky: 24
Bydliště: La republica Checa

PříspěvekZaslal: 21. září 2007, 14:20:43    Předmět: Odpovědět s citátem

rezna napsal:
ukaz ten kus kodu s DrawIndexedPrimitive


tady je
kód:


   gpd3dDevice->BeginScene();
   gpd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET |    D3DCLEAR_ZBUFFER,  D3DCOLOR_COLORVALUE(0.2, 0.3, 0.6, 1.0), 1.0f, 0 );

   ....

   gpEffect->Begin( &uPasses, 0 );
   gpEffect->BeginPass( 0 );
      
   gpd3dDevice->SetStreamSource( 0, pVB, 0, sizeof(mCustomVertexLand) );
   gpd3dDevice->SetIndices( pIB );
   gpd3dDevice->SetFVF( fvf_land );
   gpd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, vert_count 0, face_count );
 
         
   gpEffect->EndPass();
   gpEffect->End();

   ....

   gpd3dDevice->EndScene();
   gpd3dDevice->Present( NULL, NULL, NULL, NULL );


index buffer obsahuje jen par trojuhelniku (face_count je ca 100, vert_count je taky ca 100), takze vertex buffer je vlastne z 99% nevyuzitej (ma kapacitu 1mil). Chtel sem pouzivat velkej vertexbuffer, kterej naplnim na zacatku a pak si budu jenom "hrat" s index buffery.

A me se to moc logicky nezda. Milion vrcholu je sice velky mnozstvi, ale tak jako tak, v pameti mi zabiraj "pouhych" 12MB, a to jeste na grafarne, dal pouzivam indexovnani abych usetril misto a usetril pocet transformaci (dalsi 1MB dat pro indexy), zkratka clovek setri kde muze (= Smile) a najednou pri vykreslovani si "něco" zabere 320mega, coz je dost velka rezije. Nevim, ale neco musi bejt spatne, ale nevim co, a snad to neni v uzivateli Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
xtopi



Založen: 11. 08. 2007
Příspěvky: 24
Bydliště: La republica Checa

PříspěvekZaslal: 21. září 2007, 14:28:03    Předmět: Odpovědět s citátem

a jak uz sem psal, kdyz index buffer bude mit 10mil., tak bude v pameti graficky karty zabirat 120MB, (celkovou pamet mam 256MB), coz je dost, ale zase nic prehnanyho, ale pri vykreslovani si zabere dalsi 1.3GB RAM, coz mi pocitac uz rozdejchava hodne spatne, a to vykresluju jen par trojuhelniku..... Jde mi o to jen tomu porozumet, nerikam ze bych musel pouzivat 10mil. (nebo 1mil.) bodu ve vert. bufferu - kdyz budu pouzivat vic mensich VB, tak to bude v pohode a RAM to zabira "rozume"...
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: 21. září 2007, 14:37:02    Předmět: Odpovědět s citátem

Možná by stálo za to se ještě podívat na to, jakým způsobem ten vertex buffer plníš. Možná, že parametry zadávané při lockování vertex bufferu by na to mohly mít vliv...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
xtopi



Založen: 11. 08. 2007
Příspěvky: 24
Bydliště: La republica Checa

PříspěvekZaslal: 21. září 2007, 18:27:30    Předmět: Odpovědět s citátem

Jo máš pravdu, používal sem tohle:
kód:
pVB->Lock( 0, 0, (void**) &pData, DšDLOCK_DISCARD );

a když to zkusím bez toho příznaku D3DLOCK_DISCARD, tak je to zásadně lepší, teď i když má VB 10mil. bodů tak to rozběhnu a aplikace v paměti zabírá "jen" 450MB, při 1mil bodů to zabírá ca 30MB, oproti 320MB je to docela rozdíl... No, ty "flagy" asi maj nějakej smysl a nechce tam dávat pořád ty samý co se člověk naučil kdysi v nějakým tutorialu Smile
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: 21. září 2007, 18:54:34    Předmět: Odpovědět s citátem

To zabrání bude imho způsobený tím, co psal Eosie - tedy ukládáním do fronty příkazů a s tim už asi nic neuděláš.
A těch cca 30MB to imho bude tím, že si to driver zoptimalizuje a vyhradí pro každej vertex 32B. Ale to fakt jen tipuju a třeba je to blbost Wink
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: 22. září 2007, 11:09:12    Předmět: Odpovědět s citátem

mozna pokud to nemas tajny a je to maly programek mohl by jsi zaslat zdrojak
_________________
http://www.2ox.cz
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
Strana 1 z 1

 
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