[DirectX c++] Performance Problem

Hallo

Meine TileEngine funktioniert soweit eigentlich gut.
Leider krieg ich auf unserem alten PC (P3 750 Mhz, Rage 128Pro) nur 10 Frames.
Ja, dieser PC ist schon ziemlich lahm, da sollte aber schon etwas mehr drin liegen.
Age of Empires 2 beispielsweise arbeitet ja auch mit Tiles und läuft auch auf noch langsameren PC's flüssig.

Wenn ich die Funktion DrawPrimitive auskommentiere läufts auf 30 Frames. (hab den Verdacht, dass das auf dieser Grafikkarte irgendwie begrenzt ist und gar nicht mehr möglich ist)

Ich Poste hier mal den Code, der die Tiles Zeichnet.
Vielleicht hab ich aber auch irgendwo einen sehr wichtigen Renderstate oder so vergessen.

Hab schon in einem Forum gefragt, dort krieg ich aber keine Antworten mehr und die Antworten, die ich bisher bekam waren zwar hilfreich und ich konnte meinen Code sehr verbessern, halfen aber nicht den Kern des Problems zu finden.

Hier der Link
http://www.zfx.info/DisplayThread.php?TID=19911

Mein aktueller Code:
Code:
// DRAWTILES ==================================================================================================================
CTileMap::DrawTiles()
{
	// Tiles Zeichnen
	int x_Index, y_Index;
	int j, i;
	float x = 0, y = 0;

// Schleife das erste Mal ausführen und Vertices erstellen.
	for(j=0; j<m_MapHeight; j++)
	{
		// Aktuelles Tile ist oberhalb des sichtbaren Bereichs
		if(y-y_Scroll < -(TILE_HEIGHT))
		{
			y += y_offset;
			continue;
		}

		// Aktuelles Tile ist unterhalb des sichtbaren Bereichs
		else if(y-y_Scroll >= SCR_HEIGHT)
			break;

		for(i=0; i<m_MapWidth; i++)
		{
			// Aktuelles Tile zu weit links
			if(x-x_Scroll < -TILE_WIDTH)
			{
				x += TILE_WIDTH;
				continue;
			}
			// Aktuelles Tile zu weit rechts
			else if(x-x_Scroll >= SCR_WIDTH)
				break;
			else
			{	
				// Vertices aktualisieren


				/*
				Texturkoordinaten

				tu,tv
				P0 (0,0) ______(1,0) P1
						|     /|
						|    / |
						|  /   |
				P2 (0,1)|/_____|(1,1) P3
				*/
	
				vertices[0].x	= x-x_Scroll;					// P0
				vertices[0].y	= y-y_Scroll;

				vertices[1].x	= (float)x-x_Scroll+TILE_WIDTH;			// P1
				vertices[1].y	= y-y_Scroll;

				vertices[2].x	= x-x_Scroll;					// P2
				vertices[2].y	= y-y_Scroll+TILE_HEIGHT;


				vertices[3].x	= x-x_Scroll+TILE_WIDTH;			// P3
				vertices[3].y	= y-y_Scroll+TILE_HEIGHT;

				for(int n=0; n<10; n++)
				{
					if(TileMap[j][i][n] == 0 && n != 0) // Keine weiteren Tiles werden angegeben
					{
						break;
					}
					else
					{
						x_Index = (TileMap[j][i][n])%4;
						y_Index = (int)(TileMap[j][i][n])/4;

						vertices[0].tu	= 0.25f*(float)x_Index;
						vertices[0].tv	= 0.25f*(float)y_Index;

						vertices[1].tu	= 0.25f*(float)x_Index+1.0f*0.25f;
						vertices[1].tv	= 0.25f*(float)y_Index;
						
						vertices[2].tu	= 0.25f*(float)x_Index;
						vertices[2].tv	= 0.25f*(float)y_Index+1.0f*0.25f;

						vertices[3].tu	= 0.25f*(float)x_Index+1.0f*0.25f;
						vertices[3].tv	= 0.25f*(float)y_Index+1.0f*0.25f;
						
						VOID* pVertices;
						g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0);
						memcpy( pVertices, vertices, sizeof(vertices) );
						g_pVB->Unlock();

						// Rendern
						m_lpD3DDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
						m_lpD3DDevice->SetTexture(0,TileTexture);
						m_lpD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
					}

				}

				x += TILE_WIDTH;

			}
		}
		if(j&1)	// Ungerade Zeile (Nächste Zeile gerade!)
			x = 0;
		else
			x = x_offset;
		
		y += y_offset;
	}
	x = 0;
	y = 0;	

} // DRAWTILES
 
moin


Würdest du dein Programm (die Exe) mal gezippt posten?
Würde das mal testen und guckn was ich für Raten hab.


mfg
umbrasaxum
 
moin


Läuft bei mir mit 60fps.
Hast du den Beitrag unter dem Beitrag mit dem Code gelesen?
was auf jedenfalll problematisch ist, sind die vielen DrawPrimitive-Calls. ich weiß zwar nicht welche dimensionen deine m_MapWidth und m_MapHeight annehmen, aber es sind sicherlich eine ganze menge.

das dürfte die CPU mächtig belasten, besonders bei rechnern mit älteren Treibern.


mfg
umbrasaxum
 
Ein Tipp für Performance mit Direct X:

Zuerst Zeichnen und dann die ganzen Dinge wie Eingaben verarbeiten und Figuren bewegen. Denn hier kann man sich zu nutze machen, dass die Grafikkarte einen eigenen Prozessor hat. Wenn Present aufgerufen wird, wird nämlich gewartet, bis die Grafikkarte alles verarbeitet hat.

Code:
pDevice->Clear ...
pDevice->BeginScene();

Zeichnen(); // hier werden der Grafikkarte die anweisungen gegeben
Bewegen(); // während der Prozessor mit bewegen beschäftigt ist, hat der Grafikprozessor 
                 // Zeit seine Aufgaben weiter zu erledigen

pDevice->EndScene();
pDevice->Present();

EDIT: ich bekomm bei deinem Prog ne Unbehandelte Ausnahme beim Beenden
 
@Tobias K.
Ja, das war noch mit meinem alten Code.
Ich habs dann mal so geändert, dass DrawPrimitive nur einmal pro Frame aufgerufen wird.
Das brachte aber leider auch nichts.

Weiter unten bekam ich aber dann den Tip das so zu machen, wie ich es jetz mache.
(der Code von Ciclope)
Also hab ich es wieder geändert und jetzt wurden es halt wieder mehr DrawPrimitive Aufrufe.

@Flegmon
Werde die Reihenfolge ändern. Wird aber noch nichts ausmachen, da ich fast nichts anderes mache als die Map zu zeichen.

Den Fehler beim Beenden hab ich nicht.
Werde mal schauen ob ich etwas finde was ihn verursachen könnte.
 
Zuletzt bearbeitet:
Zurück