[C++] [D3D9] Input Lag - Fullscreen - VSync VS SelfSync
Verfasst: 07.10.2017, 18:46
Hallo.
In meiner Anwendung protokolliere ich jedes Frame und kann damit z.B. bei aktivem VSync das nächste Present sehr gut planen. Das ermöglicht es mir, den Input Lag sehr stark zu reduzieren.
Ein einfaches Beispiel.
- Bei 60Hz muss ich 60 FPS erreichen und damit alle 16,6ms ein neues Bild zur Verfügung stellen.
- Ich brauche für ein Bild 4ms zum Zeichnen.
- Ich verarbeite also 10ms lang Benutzereingaben.
- Danach fange ich erst an das nächste Bild zu zeichnen, und schicke es per Present zum Monitor.
- 2 bis 3ms lasse ich immer über, falls das Zeichnen doch etwas länger dauert, als vorhergesehen.
Durch diese Methode entspricht der Input Lag meistens der Zeit zum Rendern + 2 bis 3ms. In dem obigen Beispiel, wo ein Frame 4ms benötigt, liegt der Input Lag zwischen 6 und 7ms.
Im Vollbildmodus mit aktivem VSync und Input Lag Reduktion fühlt sich die Maus aber immer noch sehr schwammig an, was mich stutzig gemacht hat.
Ich habe mir dann die Funktion IDirect3DDevice9::GetRasterStatus genauer angeschaut und damit eine Möglichkeit gefunden, selber auf die nächste Bildsynchronisation zu warten. Ich habe noch nicht den optimalen Weg gefunden, den Zeitpunkt für das nächste Present festzulegen, was öfter zu Tearing am oberen oder unteren Bildschirmrand führt, aber ich sehe, bzw. vermute da eine Möglichkeit, das VSync selber zu übernehmen. Viel wichtiger ist aber die Feststellung, dass der spürbare Input Lag deutlich abgenommen hat.
Ich verstehe das aber überhaupt nicht. Die Diagramme zum Frameverlauf/Frametimes und Input Lag sehen identisch aus, zwischen VSync und SelfSync sind keine Unterschiede zu erkennen. SelfSync fühlt sich richtig gut an und VSync total schwammig. Ich zeichne selber einen Mauscursor und lasse den normalen Mauscursor aktiviert. Bei VSync erreiche ich leicht mehrere cm zwischen Hardware -und Softwarecursor. Bei SelfSync klebt der Softwarecursor fast am Hardwarecursor. Ich habe auch schon die NVidia-Grafikeinstellungen zurückgesetzt und geguckt, ob da irgendwas komisches eingestellt ist.
Was ist denn da los? Habe ich VSync komplett falsch verstanden?
In meiner Anwendung protokolliere ich jedes Frame und kann damit z.B. bei aktivem VSync das nächste Present sehr gut planen. Das ermöglicht es mir, den Input Lag sehr stark zu reduzieren.
Ein einfaches Beispiel.
- Bei 60Hz muss ich 60 FPS erreichen und damit alle 16,6ms ein neues Bild zur Verfügung stellen.
- Ich brauche für ein Bild 4ms zum Zeichnen.
- Ich verarbeite also 10ms lang Benutzereingaben.
- Danach fange ich erst an das nächste Bild zu zeichnen, und schicke es per Present zum Monitor.
- 2 bis 3ms lasse ich immer über, falls das Zeichnen doch etwas länger dauert, als vorhergesehen.
Durch diese Methode entspricht der Input Lag meistens der Zeit zum Rendern + 2 bis 3ms. In dem obigen Beispiel, wo ein Frame 4ms benötigt, liegt der Input Lag zwischen 6 und 7ms.
Im Vollbildmodus mit aktivem VSync und Input Lag Reduktion fühlt sich die Maus aber immer noch sehr schwammig an, was mich stutzig gemacht hat.
Ich habe mir dann die Funktion IDirect3DDevice9::GetRasterStatus genauer angeschaut und damit eine Möglichkeit gefunden, selber auf die nächste Bildsynchronisation zu warten. Ich habe noch nicht den optimalen Weg gefunden, den Zeitpunkt für das nächste Present festzulegen, was öfter zu Tearing am oberen oder unteren Bildschirmrand führt, aber ich sehe, bzw. vermute da eine Möglichkeit, das VSync selber zu übernehmen. Viel wichtiger ist aber die Feststellung, dass der spürbare Input Lag deutlich abgenommen hat.
Ich verstehe das aber überhaupt nicht. Die Diagramme zum Frameverlauf/Frametimes und Input Lag sehen identisch aus, zwischen VSync und SelfSync sind keine Unterschiede zu erkennen. SelfSync fühlt sich richtig gut an und VSync total schwammig. Ich zeichne selber einen Mauscursor und lasse den normalen Mauscursor aktiviert. Bei VSync erreiche ich leicht mehrere cm zwischen Hardware -und Softwarecursor. Bei SelfSync klebt der Softwarecursor fast am Hardwarecursor. Ich habe auch schon die NVidia-Grafikeinstellungen zurückgesetzt und geguckt, ob da irgendwas komisches eingestellt ist.
Was ist denn da los? Habe ich VSync komplett falsch verstanden?