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.


Anmelden zum Antworten