2017-09-12 5 views
0

Ich habe vor kurzem angefangen, DirectX-Programmierung in C++ zu lernen, und ich habe ein kleines Problem festgestellt.Verzögerung zwischen Bildern in DirectX

Die Sache ist, dass meine Übung erfordert, dass ich Farben in einer DirectX-Anwendung von einem zum anderen ändern. Ich habe eine Funktion, die das tut:

void render_frame(void) 
{ 
    // start the random generator 
    srand(time(NULL)); 

    // clear the window to random color 
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(rand() % 255, rand() % 255, rand() % 255), 1.0f, 0); 

    // begin/end/display scene 
    d3ddev->BeginScene(); 
    d3ddev->EndScene(); 
    d3ddev->Present(NULL, NULL, NULL, NULL); 
} 

Es funktioniert, aber es ist abhängig von der Zeit() Verzögerung, und ich frage mich, ob es eine bessere Entsprechung in Direct3D-Bibliothek ist. Zum Beispiel, wenn ich könnte diese Funktion, um mit bestimmten Farbe und Verzögerung in der Kette wie folgt aufrufen:

void render_frame_red(void); 
delay(1000); 
void render_frame_blue(void); 
delay(1000); 

Ich weiß, dass Funktion Sleep() in Standard-Bibliothek vorhanden ist, aber es buchstäblich friert mein Fenster (ich kann‘ t mit ihm während der Verzögerung interagieren). Vielleicht kann ich die Zeit für ein anderes Ticket einstellen, damit es so oft aktualisiert wird, wie ich es möchte?

Ich weiß, es ist eine kleine Sache und ich würde es wahrscheinlich später auf meiner Reise mit 3D-Programmierung herausfinden, aber es würde nicht weh tun, wenn ich mehr darüber wüsste, wie die Dinge in DirectX funktionieren.

+0

Rufen Sie srand() nur einmal in einem Programm auf. –

+0

Ja, das ist mein Fehler. Ich nenne es normalerweise am Anfang meiner main() - Funktion (WinMain() in diesem Fall). – RPAnimation

+0

@NeilButterworth Eigentlich einmal in einem Thread. Oder benutze '' std :: random_device'. Was Frage betrifft, befasst sich DirectX überhaupt nicht mit Zeit. Alle verwandten Funktionen sind jetzt in DXGI vorhanden (siehe [IDXGISwapChain] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb174569 (v = V.85) .aspx)) und System-Timer. – VTT

Antwort

0

Das allgemeine Modell für Direct3D ist es, Frames "so schnell wie möglich" zu rendern und dann zeitbasierte Operationen in Ihrem Programm mit Animation zu beschäftigen. Herkömmliche GDI-Zeichnungen zeichnen nur "on-demand", was Sie mit Direct3D machen können, macht aber die Sache schwieriger.

Mit anderen Worten, verwenden Sie Uhrzeit statt Frame-Anzahl, um Animationen und Effekte zu steuern. Eine gute Timer-Lösung für das Direct3D-Rendering finden Sie unter this blog post.

BTW, investieren nicht Ihre Zeit Vermächtnis Direct3D 9 in das Lernen, die auf die Unterstützung von Code aus dem veralteten DirectX SDK stark angewiesen und benötigt das Erbe Direct die alte Helfer Bibliothek D3DX9 (siehe MSDN) einzusetzen. Verwenden Sie DirectX 11. Siehe DirectX Tool Kit.

+0

Was ist der Hauptunterschied zwischen diesen beiden? Ich weiß, dass DirectX SDK nicht mehr aktualisiert wird, aber nicht auf den gleichen Wurzeln basiert? (Syntax, Kommunikation mit GPU, Technologien etc.) Verwenden moderne Entwickler DirectX Tool Kit, um ihre Spiele zu erstellen? Ich weiß, dass ich Fragen ohne Grundlage stelle, aber ich muss sicher sein, bevor ich meine Studien aus dem veralteten SDK fallen lasse. – RPAnimation

+0

@RPAnimation 'DirectX SDK' wird ziemlich häufig aktualisiert, aber es wurde ein Teil von' Windows SDK'. Das separate "DirectX SDK" ist ein veraltetes veraltetes SDK. 'DirectX Tool Kit' ist ein Paket von Support-Bibliotheken zur Vereinfachung der Entwicklung (und es wird auch ziemlich häufig aktualisiert). – VTT

+0

In meinem Blog gibt es Dutzende von Posts zum Status des DirectX-SDKs zu verschiedenen Themen. Beginnen Sie mit dem obigen MSDN-Link für den Kontext und sehen Sie sich dann [das Blog] an (https://blogs.msdn.microsoft.com/chuckw/tag/dxsdk/). Die meisten Spieleentwickler verwenden entweder eine vorhandene Spiele-Engine (die DirectX 11/12 verwendet) oder sie kennen DirectX bereits gut genug, um ihre eigene Engine zu schreiben. Ich habe auf _DirectX Tool Kit_ als eine zugängliche Möglichkeit hingewiesen, DirectX 11 in C++ zu lernen, basierend auf unterstützten Open-Source-Bibliotheken, die die Verwendung des veralteten DirectX SDK vermeiden. Die meisten anderen Online-Tutorials sind in dieser Hinsicht veraltet. –