Was begrenzt maximale Anzahl an Poygonen?
-
Hallo allerseits!
Ich möchte mit DirectX Funktionen von N² -> R darstellen, und zwar auf einem möglichst großem Bereich und möglichst genau.
Dazu bastelte ich mir einen Polygonteppich in der x-y-Ebene, der z-Wert entspricht dem Funktionswert.
Im Prinzip also recht einfach, grob gesagt alles wie in den ersten DirectX Tutorials (bis "Using Matrices"), nur, dass ich nicht nur ein Dreieck zeichne, sondern xBloecke * yBloecke * 2 Dreiecke (genaueres siehe unten).
Das geht auch gut, bis zu einer maximalen Größe von xBloecke = 104 und yBloecke = 103, also bis 21424 Dreieecke.
Danach erhalte ich (beim Ausführen der fehlerfrei kompilierten Anwendung) Speicherzugriffsfehler.
Ist da nicht mehr drin?
Selbst mit der maximalen Größe belegt die Anwendung gerade mal 8MB Arbeitsspeicher, da wäre also schon noch Platz für mehr.Weshalb gibt es dann diese Probleme und wie kann ich sie vermeiden?
Danke und Gruß!
Anhang:
Initialisierung des Graphikpuffers:HRESULT InitGeometry() { // Initialize Vertices Pattern CUSTOMVERTEX g_Vertices[6*xBloecke*yBloecke]; // Festlegung des Grundgitters //x- und y- Koordinaten for (int j = 0; j < yBloecke; j++) { for (int i = 0; i < xBloecke; i++) { g_Vertices[6 * xBloecke * j + 6* i + 0].x = xStep * i + xOffset; g_Vertices[6 * xBloecke * j + 6* i + 0].y = yStep * j + yOffset; g_Vertices[6 * xBloecke * j + 6* i + 0].color = 0xffff0000; g_Vertices[6 * xBloecke * j + 6* i + 1].x = xStep * i + xOffset + xStep; g_Vertices[6 * xBloecke * j + 6* i + 1].y = yStep * j + yOffset + yStep; g_Vertices[6 * xBloecke * j + 6* i + 1].color = 0xff00ff00; g_Vertices[6 * xBloecke * j + 6* i + 2].x = xStep * i + xOffset; g_Vertices[6 * xBloecke * j + 6* i + 2].y = yStep * j + yOffset + yStep; g_Vertices[6 * xBloecke * j + 6* i + 3].x = xStep * i + xOffset; g_Vertices[6 * xBloecke * j + 6* i + 3].y = yStep * j + yOffset; g_Vertices[6 * xBloecke * j + 6* i + 4].x = xStep * i + xOffset + xStep; g_Vertices[6 * xBloecke * j + 6* i + 4].y = yStep * j + yOffset; g_Vertices[6 * xBloecke * j + 6* i + 5].x = xStep * i + xOffset + xStep; g_Vertices[6 * xBloecke * j + 6* i + 5].y = yStep * j + yOffset + yStep; // Farbe habe ich der Übersich halber hier weggelassen } } // z-Koordinate zunächst 0. for (int i = 0; i < 6*xBloecke*yBloecke; i++) { g_Vertices[i].z = 0.0; // g_Vertices[i].rhw = 1.0; } // Create the vertex buffer. if( FAILED( g_pd3dDevice->CreateVertexBuffer( yBloecke*xBloecke*2*3*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL ) ) ) { return E_FAIL; } // Fill the vertex buffer. VOID* pVertices; if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (void**)&pVertices, 0 ) ) ) return E_FAIL; memcpy( pVertices, g_Vertices, sizeof(g_Vertices) ); g_pVB->Unlock(); return S_OK; }mit:
LPDIRECT3D9 g_pD3D = NULL; // Used to create the D3DDevice LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // Our rendering device LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // Buffer to hold vertices // A structure for our custom vertex type struct CUSTOMVERTEX { FLOAT x, y, z; // The untransformed, 3D position for the vertex DWORD color; // The vertex color }; // Our custom FVF, which describes our custom vertex structure #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
-
Da ist genau so viel drin, wie die Caps deiner GraKa angeben. Es ist deine Aufgabe diese abzufragen und zu beachten. Ansonsten kannst du dir höchstens was Besseres kaufen oder beim Hersteller beschwerden. f'`8k
Bye, TGGC (\-/ returns)
-
TGGC schrieb:
Da ist genau so viel drin, wie die Caps deiner GraKa angeben.
Was, meine GeForce5200 soll nur 20000 Polygone darstellen können?
Irgendwie habe ich da Zahlen weitaus größerer Größenordnung im Kopf...
(...siehe z.B. hier)Daher habe ich das Gefühl, dass es im Moment bei mir noch nicht daran liegt!
Was könnte es sonst sein?
Danke und Gruß!
-
dong schrieb:
TGGC schrieb:
Da ist genau so viel drin, wie die Caps deiner GraKa angeben.
Was, meine GeForce5200 soll nur 20000 Polygone darstellen können?
Wieso? Sie kann auch 2 mal 20000 Polys darstellen f'`8k.
Bye, TGGC (\-/ returns)
-
TGGC schrieb:
Wieso? Sie kann auch 2 mal 20000 Polys darstellen f'`8k.
Wie darf ich das verstehen?
Wie oben geschrieben, war der höchste Wert an Polygonen, der keine Speicherzugriffsverletzung bei der Ausführung des Programmes verursachte, 21424.Wie soll das dann mit 2* gehen?
Einen zweiten Puffer anlegen?
Danke und Gruß!
(P.S.: Weder google noch ich wissen, was "f'`8k" bedeuted...)
-
2 rendervorgänge mit 2 puffern zb.
-
dong schrieb:
Wie soll das dann mit 2* gehen?
Genau so wie ich es sag. Du malst 20000 Polys, das geht ja. Und dann malst du nochmal 20000. Und schon hast du mehr als 20000, oder etwa nicht?
BTW: Schon mal von Smilies gehört?
Bye, TGGC (\-/ returns)
-
dong schrieb:
Danach erhalte ich (beim Ausführen der fehlerfrei kompilierten Anwendung) Speicherzugriffsfehler.
1. was biddä könnte kompilieren damit zu tun haben das speicherfehler auftretten bzw nicht?
2. an welcher stelle im debugger bleibt er denn mit dem speicherfehler hängen?
-
rapso schrieb:
1. was biddä könnte kompilieren damit zu tun haben das speicherfehler auftretten bzw nicht?
Ich wollte nur betonen, dass das Problem nicht darin liegt.
rapso schrieb:
2. an welcher stelle im debugger bleibt er denn mit dem speicherfehler hängen?
Also:
Es wird angezeigt:Unhandled exception at 0x00415cb7 in mfc-test.exe: 0xC00000FD: Stack overflow.
und gezeigt wird auf Zeile 99 in chkstk.asm :
; Find next lower page and probe cs20: sub eax, _PAGESIZE_ ; decrease by PAGESIZE test dword ptr [eax],eax ; probe page. // das ist Zeile 99 jmp short cs10Zu dem Tipp mit zwei oder mehreren Puffern:
Ich bin ja absolutes Frischfleisch und habe keine Ahnung, dahe mal naiv gefragt:
Wie viele Puffer sind denn üblich, gibt es auch da eine Begrenzung?Und wie würded Ihr das Problem dann angehen?
Wäre z.B. ein eigener Puffer für jede x-Zeile xBloecke der darzustellenden Funktion (also nicht die x-Bildschirmkoordinate, Problemstellung siehe erster Beitrag) ein vernünftiger Ansatz?Danke und Gruß!
-
Ach ja, und noch dazu:
TGGC schrieb:
Es ist deine Aufgabe diese abzufragen und zu beachten.
Hat jemand zufällig einen Link dazu?
Ich hab nichts gefunden... :oops:
Danke und Gruß!
-
Siehe DXSDK Doku. f'`8k
Bye, TGGC (\-/ returns)
-
TGGC schrieb:
Siehe DXSDK Doku.
Hättest Du ein Suchstichwort? Suche nach "Memory" in der DirectX SDK Documentation liefert sagenhafte 0 Treffer...
-
Wie ich schon sagte, Caps. f'`8k
Bye, TGGC (\-/ returns)
-
TGGC schrieb:
Wie ich schon sagte, Caps. f'`8k
Danke, hatte ich anfangs nicht so interpretiert. (Wer "f'`8k" schreibt kürzt womöglich auch Kapazität mit "Caps" ab...;))
-
Nein, aber Capabilities. f'`8k
Bye, TGGC (\-/ returns)
-
CUSTOMVERTEX g_Vertices[6*xBloecke*yBloecke];Wieso legst du so einen rießigen Array auf dem Stack ab? Mach doch lieber mit new.
CUSTOMVERTEX g_Vertices = new CUSTOMVERTEX[6*xBloecke*yBloecke]; ... delete[] g_Vertices;Unhandled exception at 0x00415cb7 in mfc-test.exe: 0xC00000FD: Stack overflow.
Ein Stack overflow wird doch dann geworfen, wenn der Stack voll ist. Also hat die Fehlermeldung nichts mit der Grafik zu tun, sondern weil du einen zu großen Array auf den Stack ablegen willst.
Mit new erstellst du dein Array auf dem Heap, somit dürfte größere Arrays möglich sein.
Aber TGGC hat schon recht, dass eine Graka nur begrenzte Anzahl an Polygonen auf einmal rendern kann.
-
Hmm, das g_ ist woh lauch nicht mehr das, was es mal war... f'`8k
Bye, TGGC (\-/ returns)
-
die 5200 kann nur vertexbuffer <65535 elemente - abzueglich ein paar weiterer indices die als steuerflags verwendet werden.
und 104*103*2*3= 64272. also ziemlich nah dran.
die loesung, wie schon gesagt, sind mehrere vertexbuffer.
anfaenglich wuerd's auch schon helfen nicht jedes dreieck mit drei eigenstaendigen verticen zu definieren.
-
hellihjb schrieb:
die 5200 kann nur vertexbuffer <65535 elemente - abzueglich ein paar weiterer indices die als steuerflags verwendet werden.
und 104*103*2*3= 64272. also ziemlich nah dran.
die loesung, wie schon gesagt, sind mehrere vertexbuffer.Ah ja, sehr aufschlussreich, danke!

Ich arbeite jetzt mit 100 Vertexbuffern und es klappt alles wie erwünscht. (Auch wenn wohl keiner ein Spiel in dieser Geschwindigkeit spielen wollte, ber wie gesagt, darum geht es nicht...)Danke an alle!
