Floating-Point-Problem:
Gerade bei
DirectX/
OpenGL - Sachen kann es sehr oft vorkommen, dass du durch sehr kleine Werte dividieren musst (z.B. 0,00000001). Wenn du jetzt den Flag von gerade nicht setzt, dann kann es sein, dass die CPU denkt, du teilst durch 0. Die CPU rundet sozusagen und eine Division durch 0 ist ja nicht so dolle. Wenn du diesen Flag jetzt aber setzt, dann rundet die CPU nicht und versucht das Ergebniss trotzdem auszurechnen. Wenn du dann mal wirklich durch 0 teilst, wird keine
Exception ausgelöst, sondern das Ergebniss bekommt einen bestimmten Flag (kannst mal bei der Definition von IEEE nachschauen, welches Bit dafür gesetzt wird). Es gibt verschiedene Flags, die zeigen, ob die Floating-Point-Zahl gültig ist. Es gibt z.B. NaN (not a Number) oder Inf (infinity). Das kannst du einfach ausprobieren:
Schreibe ein kleines Program, bei dem du den Flag aktivierst. Dann erstellst du eine Floating-Point-Division, die durch 0 Teilt (25.0 / 0.0). Das Ergebniss gibst du dann per FloatToStr in ein Label. Dort wirst du dann keine Zahl sondern INF darstehen haben.
Der Flag sollte allerdings einmal und wenn möglich gleich zu Beginn des Programms gesetzt werden.
Vertikale Synchronisation:
An sich ist das eine sehr gute Sache - auch wenn sie sehr verwirrend ist (wieso hab ich nur 60 FPS
). Es ist nun so: Wenn vSync aktiviert ist, dann sendet die Grafikkarte den gerenderten Buffer erst zum Bildschirm, wenn dieser mit dem letzten Bild fertig ist. Die Herzzahl des Monitors (bei TFTs 60Hz) sagt, wie schnell der Bildschirm ein neues Bild aufbauen kann (das hat nichts mit der Reaktionszeit zu tun, damit ist eher das Nachleuchten der einzelnen Pixels gemeint). Jetzt ist es bei abgeschalteten vSync so:
Die Grafikkarte rendert ein Bild und schickt es zum Monitor. Der baut das Bild dann zeilenweise auf. Während der Monitor aber noch nicht fertig ist, hat die Grafikkarte bereits ein neues Bild gerendert. Also bekommt der Monitor während dem Aufbau des alten Bildes bereits die Information des neuen Bildes und zeichnet dann mit den neuen Informationen weiter. Bei statischen Sachen ist das nicht schlimm, da sich das alte nicht vom neuen Unterscheidet. Aber gerade bei unteschiedlichen Bildern kann es dann zu Bildfehlern kommen, da zwei unterschiedliche Bilder kombiniert werden. Das kann man z.B. sehen, wenn man ein sich in einem Ego-Shooter immer im Kreis dreht. Dann kann es sein, dass die obere hälfte des Bildschirms die alte Rotation zeigt und der untere Teil die neue Rotation. Somit enstehen Bildversetzungen, die sehr komisch aussehen.
Was aber ganz wichtig ist: vSync beeinflusst nicht, in welchem Zustand der Buffer an den Bildschirm geschickt wird. Der Buffer wird immer nur dann zum Bildschirm geschickt, wenn er fertig ist. VSync sagt dann nur, ob die Grafikkarte mit dem Senden noch warten soll bis der Bildschirm fertig ist.
vSync sollte meiner Meinung nach immer aktiviert sein (außer bei Benchmarks). Das hat mehrere Vorteile:
- Bei Laptops spart diese Einstellung Strom, da die Grafikkarte nicht immer ausgelastet ist
- Kleine FPS-Zahlen bedeuten größere DeltaTimes. Dadurch werden Floating-Point-Operationen genauer
- Es enstehen keine ungewollten Bildfehler
Für Testzwecke kann man vSync schon mal ausschalten, um zu sehen, wie schnell das Programm läuft. Aber in der finalen Anwendung ist es dann doch egal, ob nun 60 FPS oder 300 FPS angezeigt wird. Menschen sehen alles ab 25 FPS flüssig (mache erst ab 30 FPS), aber niemand kann sagen, dass er einen Unterschied zwischen 60 und 300 FPS erkennen kann - das kann unser Auge und unser Gehirn nicht.
//Edit: Floating-Point-Problem besteht immer noch