![]() |
DirectX-Forum - Beitragsübersicht - |
|
Thema | DX9: Direct3D extrem langsam |
Von |
Cheaterhater |
Datum |
28. April 2010 um 21:01:27 |
Frage |
Hallo,
Ich hatte vor einiger Zeit mal ein kleines Spiel programmiert, für das ich der Einfachheit halber GDI+ (mit selbstgebauter Doppelpufferung) für die Grafikausgabe verwendet hatte. Das Spiel selbst läuft im Fenstermodus mit einer Fenstergröße von gerade einmal 229x261 Pixeln. Dann hatte ich mir überlegt, dass es wegen der Geschwindigkeit vielleicht besser wäre, das ganze mit Direct3D zu machen, wozu ich DirectX 9 - 2D mit Direct3DX [.Net-Tipp 0129] und Direct3D 9 - Direct3D im Fenster (Window Mode) [.Net-Tipp 0130] (für den Fenstermodus) benutze. D. h., ich erstelle das D3DDevice wie in Direct3D 9 - Direct3D im Fenster (Window Mode) [.Net-Tipp 0130] angegeben: Dim pParameter As New Microsoft.DirectX.Direct3D.PresentParameters pParameter.Windowed = True pParameter.SwapEffect = Microsoft.DirectX.Direct3D.SwapEffect.Discard D3DDevice = New Microsoft.DirectX.Direct3D.Device(0, _ Microsoft.DirectX.Direct3D.DeviceType.Hardware, Me.Handle, _ Microsoft.DirectX.Direct3D.CreateFlags.SoftwareVertexProcessing, pParameter) D3DSprite = New Microsoft.DirectX.Direct3D.Sprite(D3DDevice) Testweise habe ich dann einmal das Hauptmenü mit D3D zeichnen lassen. Dabei wird genau eine einzige Textur, die vorher erstellt wird, auf das Formular gezeichnet: D3DDevice.Clear(Microsoft.DirectX.Direct3D.ClearFlags.Target, BGColor, 1.0F, 0) D3DDevice.BeginScene() D3DSprite.Begin(Microsoft.DirectX.Direct3D.SpriteFlags.AlphaBlend) D3DSprite.Draw2D(StaticTexStart, BufferRect, BufferSize, NullPoint, NullColor) D3DSprite.End() D3DDevice.EndScene() D3DDevice.Present() Während ich diese Textur mit GDI+ über 1000 mal in der Sekunde zeichnen konnte, kommt D3D dabei nur auf magere 40 mal, erreicht also nur 4% der Geschwindigkeit von GDI+. Da kann also definitiv etwas nicht stimmen, ich weiß leider nur nicht, was, da Programmierung mit Direct3D ziemliches Neuland für mich ist.
Ich hoffe, dass ich mein Problem einigermaßen klar ausdrücken konnte und es jemanden gibt, der mir helfen kann und bedanke mich im Voraus. |
|
Antwort: |
Von |
Nico |
E-Mail |
nico.schertler@gmx.de |
Datum |
28. April 2010 um 21:58:26 |
Antwort |
Hallo!
Ich nehme mal an, dass das nicht am Zeichnen der Textur liegt. Wenn du das rausnimmst, werden es wahrscheinlich immer noch 40 fps bleiben, oder? Hast du in deinen PresentParameters ein PresentInterval eingestellt? Falls das auf One ist, ist die Framerate nämlich maximal so hoch wie die Bildschirmfrequenz. Wenn du da Immediate einstellst, ist das nicht der Fall. Und die Framerate wird auch richtig berechnet, oder? Normalerweise sollte so eine Anwendung, die fast nichts macht, auf MidRange-Grakas bei 300+ fps laufen. Wie groß ist deine Textur, und in welchem Pool hast du sie abgelegt? Zuletzt könnte noch die CPU das ganze ausbremsen. Aber da du wahrscheinlich neben dem Zeichnen nicht viel machst, wird das wohl nicht der Fall sein.
Nico |
|
[ Antwort schreiben | Zurück zum DirectX-Forum | Forum-Hilfe ] |
|
Letzte Aktualisierung: Sonntag, 13. Dezember 2015 |
|