Ein Vertexbuffer mehrmals pro Frame Zeichnen
-
Hallo,
ich programmiere gerade ein 2D Spiel, bei dem für jeden Spieler ein Panzer aufs
Spielfeld gezeichnet werden muss. Dafür verwende ich einen Vertexbuffer, den
ich mehrmals mit den benötigten Vektoren lade und zeichne. Auf meinem Computert
sowie auf einigen anderen werden alle Fahrzeuge problemlos angezeigt. Auf
meinem Tablet, sowie auf dem PC eines Freundes wird immer das erste Fahrzeug
nicht angezeigt. Kann es sein, dass ich für jedes Fahrzeug einen separaten VB
benutzen muss?Codeausschnitt:
for (int i = 0; i < MAX_PLAYERS;i++) { if (players[i].active && players[i].exist) //if player is playing { //align position x = (float) players[i].x -5; y = (float) players[i].y -5; color = players[i].color; CUSTOMVERTEX vertices[] = { //Rumpf { x+0.0f, y+3.0f, 0.0f, 1.0f, color, }, { x+3.0f, y+0.0f, 0.0f, 1.0f, color, }, { x+17.0f, y+0.0f, 0.0f, 1.0f, color, }, { x+20.0f, y+3.0f, 0.0f, 1.0f, color, }, { x+18.0f, y+5.0f, 0.0f, 1.0f, color, }, { x+2.0f, y+5.0f, 0.0f, 1.0f, color, }, //Kanone { x+7.0f, y, 0.0f, 1.0f, color, }, { x+7.0f, y-2.0f, 0.0f, 1.0f, color, }, { x+12.0f, y-2.0f, 0.0f, 1.0f, color, }, { x+12.0f, y, 0.0f, 1.0f, color, }, }; //Save in Buffer d3dvb_vehicles->Lock(0, sizeof(vertices), (void**)&pVertices, 0); memcpy( pVertices, vertices, sizeof(vertices) ); d3dvb_hud->Unlock(); //Show on screen d3ddev->SetStreamSource(0, d3dvb_vehicles, 0, sizeof(CUSTOMVERTEX)); d3ddev->SetFVF( D3DFVF_CUSTOMVERTEX ); d3ddev->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, 4 ); d3ddev->DrawPrimitive( D3DPT_TRIANGLEFAN, 6, 2 ); }
-
Ich bin kein D3D Experte, aber ich behaupte mal das sollte so gehen.
Wobei es mMn. keinen Sinn macht hier einen Vertex-Buffer zu verwenden. Wenn du pro Lock/Unlock bloss 1x zeichnest, dann lass den Vertex-Buffer ganz weg und zeichne gleich mit DrawPrimitiveUP.
Und natürlich solltest du den Returnwert von Lock() prüfen. (Und von den weiteren Funktionen wie SetStreamSource, SetFVF, ...). Und wenn was nicht erfolgreich war tracen/loggen/anzeigen.
Und ein kleiner Performance-Tip:
DrawPrimitive
ist relativ teuer. Daher sieht man normalerweise zu dass man es nicht unnötig oft aufruft.
D.h. du musst weg von den Triangle Fans. Entweder du verwendest gleich Triangle Lists (indexed oder nicht sollte hier keine Rolle spielen), oder du nimmst stattdessen Triangle-Strips, und verwendest als Übergang ein degeneriertes Dummy-Dreieck.Noch besser wäre dann Instancing, aber das ist vermutlich Overkill.
-
Vielen Dank für die schnelle Antwort!
Ich werde es sofort ausprobieren.
Der Fehler tritt übrigends bei Windows 8 auf.