2012-04-04 2 views
0

Ich bekomme einige Wiederholungen in meiner OpenGL-Anwendung. Ich benutze die Win32 API um das Fenster zu erstellen und ich erstelle auch einen 2.2 Kontext. So ist die Hauptschleife des Programms ist sehr einfach:Constantly Lag in OpenGL-Anwendung

  • die Pufferfarb Löschen
  • Zeichnen eines Dreiecks
  • Vertauschen der Puffer.

Das Dreieck dreht sich, so kann ich die Verzögerung sehen. Auch meine Frame-Zeit ist nicht glatt, was das Problem sein kann. Aber ich bin sehr, sehr sicher, dass die Delta-Zeit Berechnung korrekt ist, weil ich viele Möglichkeiten ausprobiert habe.

Denken Sie, es könnte ein Grafiktreiberproblem sein? Weil ein Freund von mir fast das exakt gleiche Programm ausführt, außer dass ich weniger Berechnungen mache + Ich benutze den Standard OpenGL Shader. Auch verwendet sein Programm mehr CPU-Leistung als meins und die CPU% ist glatter als meins.

Ich sollte auch hinzufügen: Auf meinem Laptop bekomme ich die gleiche Verzögerung alle ~ 1 Sekunde, so dass ich eine Art Muster sehen kann.

+0

Haben Sie eine Schlafanweisung in Ihrem Code? Versuchen Sie, die Dauer der Schlafanweisung zu erhöhen und die Anzahl der Umdrehungen pro Iteration zu erhöhen. –

Antwort

1

Es gibt viele Gründe für eine wackelige Bildrate. Aus der Spitze von meinem Kopf:

  • Nicht glFlush() am Ende jedes Rahmens ruft
  • andere laufende Software
  • störende Dinge in Ihrem Code zu tun, dass bestimmte Grafiktreiber nicht mag
  • Fehler in Grafiktreiber, die Standard-Windows-Zeitfunktionen mit ihren schrecklichen Auflösung
  • mit

diese versuchen:

  • töten Sie so viele laufende Programme, wie Sie damit durchkommen können. Verwenden Sie dazu die Registerkarte Prozess im Taskmanager (CTRL - SHIFT - ESC).
  • Stück für Stück, verringern Sie die Menge an Arbeit, die Ihr Programm tut, und sehen Sie, wie dies die Bildrate und die Glätte des Displays beeinflusst.
  • Wenn Sie können, versuchen Sie aktivieren/deaktivieren vertikale Synchronisierung (Sie können dies in Ihrer Grafikkarte Einstellungen tun), um zu sehen, ob das hilft
  • fügen Sie einige Debug-Code, um die Zeit zum Zeichnen jedes Rahmens auszugeben, und sehen Sie, ob es Anomalien in den Zahlen gibt, z jeder 20. Frame braucht zusätzliche 20 ms oder zufällige Frames, die 100 ms benötigen.
+0

Vergessen Sie nicht, im Falle von Hardware-Rendering, die gesamte CPU-Zeit in Ihrem Haupt-Loop-Abfrage für die Eingabe und warten auf den neuen Frame. Grafiktreiber benötigen ebenfalls eine CPU. –

+0

GlFlush wird von SwapBuffers impliziert, es ist nicht notwendig, es in einem doppelt gepufferten Kontext aufzurufen. – datenwolf

+0

Danke.Ich drucke jetzt die Frame-Zeit in ms, aber nur wenn ms> 10.0f. Ich bekomme einige interessante Ergebnisse. Wenn mein Drehdreieck Glitch Lag ist, liegt die ms bei 17-32 (oft ~ 30). Die Frame-Zeit beträgt etwa 3 ms, wenn es flüssig läuft, ich habe nicht getestet, wie lange es zwischen den Lags dauert, aber haben Sie eine Idee, was das Problem sein könnte? – user1312724