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
|
Zaslal: 20. září 2007, 00:22:08 Předmět: DirectX - jak je to s pameti u vertexbufferu? |
|
|
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 |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 20. září 2007, 09:16:08 Předmět: |
|
|
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 |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 20. září 2007, 14:55:19 Předmět: |
|
|
320MB je fakt trochu moc, nekde je neco strasne spatne. Nemas treba Intel kartu nebo neco takovyho? _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
Crusty
Založen: 28. 08. 2007 Příspěvky: 120 Bydliště: Praha
|
Zaslal: 20. září 2007, 17:44:24 Předmět: |
|
|
.. 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 |
|
|
xtopi
Založen: 11. 08. 2007 Příspěvky: 24 Bydliště: La republica Checa
|
Zaslal: 20. září 2007, 17:59:52 Předmět: |
|
|
tak se omlouvám, chyba je u mě...
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 |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 21. září 2007, 10:13:50 Předmět: |
|
|
ukaz ten kus kodu s DrawIndexedPrimitive |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 21. září 2007, 11:38:22 Předmět: |
|
|
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 |
|
|
xtopi
Založen: 11. 08. 2007 Příspěvky: 24 Bydliště: La republica Checa
|
Zaslal: 21. září 2007, 14:20:43 Předmět: |
|
|
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 (= ) 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 |
|
Návrat nahoru |
|
|
xtopi
Založen: 11. 08. 2007 Příspěvky: 24 Bydliště: La republica Checa
|
Zaslal: 21. září 2007, 14:28:03 Předmět: |
|
|
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 |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 21. září 2007, 14:37:02 Předmět: |
|
|
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 |
|
|
xtopi
Založen: 11. 08. 2007 Příspěvky: 24 Bydliště: La republica Checa
|
Zaslal: 21. září 2007, 18:27:30 Předmět: |
|
|
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 |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 21. září 2007, 18:54:34 Předmět: |
|
|
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 |
|
Návrat nahoru |
|
|
Crusty
Založen: 28. 08. 2007 Příspěvky: 120 Bydliště: Praha
|
Zaslal: 22. září 2007, 11:09:12 Předmět: |
|
|
mozna pokud to nemas tajny a je to maly programek mohl by jsi zaslat zdrojak _________________ http://www.2ox.cz |
|
Návrat nahoru |
|
|
|