VSync-Einstellung der Grafikkarte im Programm herausfinden



  • Das Ein- und Ausschalten der VSync ist ja nur möglich, wenn in der Grafikkarten-Systemsteuerung nicht "automatisch Ein" oder "automatisch Aus" eingestellt ist.
    Doch wie finde ich heraus, was in der Grafikkarten-Systemsteuerung eingestellt ist?
    Ich brauche dies in meinem Programm, um darauf reagieren zu können. Ist es überhaupt möglich, das in einem Programm abzufragen?



  • Senfti schrieb:

    Ist es überhaupt möglich, das in einem Programm abzufragen?

    Da du hier im Spiele-Board postest, nehme ich mal an, du willst kein SysTool oder so basteln. Deswegen sollte die Frage eher lauten: Ist es überhaupt sinnvoll das in einem Programm abzufragen?

    Eigentlich sollte dein Programm unabhängig von solchen Systemeinstellungen arbeiten können. Ich sehe das so: Biete dem Benutzer in einem Pre-Game-Dialog oder In-Game-Menü die Möglichkeit VSync an- oder auszustellen. Wenn er es systemseitig ganz ausgeschalten hat, dann ja wohl weil er es nicht haben will.

    Ansonsten: Was hast du damit vor? Vermutlich kann man das Problem auch anders und eleganter lösen - ohne platformspezifische Systemeinstellungen auszulesen.



  • Das Problem bei meinem Spiel ist, dass ich die VSync zugleich auch als Timer verwende. Jetzt lese ich zu Beginn die Bildwiederholfrequenz aus und kann so dann die benötigte Geschwindigkeit für das Spiel errechnen.

    Problematisch wird es aber dann, wenn ich zwar die richtige Bildwiederholfrequenz auslese, aber ich die VSync nicht einschalten kann, was dazu führt, dass das Spiel viel zu schnell abläuft. Das ganze einfach über einen Timer zu machen hat den Nachteil, dass dann Bildaufbau und Timer nicht hundertprozentig synchron sind, was dazu führt, dass es nicht schön flüssig aussieht.

    Aus deiner Antwort geht aber hervor, dass auf jedem PC standardmäßig die VSync vom Programm ein- und ausgeschaltet werden kann. Da ist es wahrscheinlich einfacher, ich weise darauf hin, diese Einstellung in den Orginalzustand zu belassen, denn wer sie ändern kann, der kann sie hoffentlich auch zurücksetzen.



  • Nimm einen Timer zum Zeitmessen.
    Alles andere ist Blödsinn.



  • Senfti schrieb:

    Das Problem bei meinem Spiel ist, dass ich die VSync zugleich auch als Timer verwende. Jetzt lese ich zu Beginn die Bildwiederholfrequenz aus und kann so dann die benötigte Geschwindigkeit für das Spiel errechnen.

    Also dazu solltest du echt einen Timer nehmen. Alternativ könntest du auch ein Sleep(1.0f/60 * 1000) oder so in die Hauptschleife einbauen.

    Senfti schrieb:

    Das ganze einfach über einen Timer zu machen hat den Nachteil, dass dann Bildaufbau und Timer nicht hundertprozentig synchron sind, was dazu führt, dass es nicht schön flüssig aussieht.

    Das Frame sollte eigentlich in den Backbuffer gerendert werden. Der wird dann geflippt und du hast das fertige Bild auf dem Schirm. Du verwendest doch Doublebuffering, oder?

    Aus deiner Antwort geht aber hervor, dass auf jedem PC standardmäßig die VSync vom Programm ein- und ausgeschaltet werden kann.

    Jo klar, je nach API oder Engine kann man das meistens beim Erstellen des Fensters festlegen. Die systemweite Einstellung "VSync immer ein/aus" kenne ich jedoch nicht, wahrscheinlich hat diese Einstellung Vorrang.



  • Habe das Problem einfach dadurch umgangen, dass ich abhängig von der Dauer des letzten Schleifendurchlaufs die Spiel-Geschwindigkeit berechne, was jetzt auch gut funktioniert.

    Noch eine Frage: Ich hatte einmal ein Problem mit der Zeitmessung bei meinem Laptop(war beim SPS-Programmieren mit Beckhoff). Da hat diese völlig falsche Werte geliefert. Soll irgendwie mit Energiesparung in Zusammenhang stehen. Ist dieses Probelm auch bei der Zeitmessung mit dem QueryPerformanceCounter, welchen ich jetzt verwende, möglich?



  • Nein. Das Problem war wohl dass deine frühere Methode den Time Stamp Counter der CPU verwendet hat was generell keine gute Idee ist. Mit dem Performance Counter sollte es da keine Probleme geben.



  • Ok. Danke!



  • Hihi, doch, möglich ist es schon. Sollte mit aktuell gepatchten Windows Versionen nicht passieren, aber garantieren kann dir das keiner für jede mögliche Kombination aus Chipset/CPU/BIOS/Windows-Version.

    Daher wird gerne ein "kombinierter" Timer aus timeGetTime() + QueryPerformanceCounter() verwendet. Dabei nimmt man grundsätzlich die Zeit wie sie QueryPerformanceCounter() liefert, und verwendet timeGetTime() um quasi gegenzuchecken.


Anmelden zum Antworten