V Sync nu an oder aus bei Spielen ???

  • Hi !


    Überall stehen hier verschiedene Meinungen ???
    Was ist defenitiv denn nu besser ?
    An oder aus ?


    Ich habe nämlich manchmal das Gefühl, dass meine Mausbewegungen mit etwas Lag manchmal umgesetzt werden ?


    Kommt das vom TFT oder ist das ein Compi Prob ?


    Gruss Hoffi

  • Hallo zusammen,


    Sorry wenn ich mich einmische, aber ein bisschen sträuben sich mir gerade die Haare...


    Ob VSync besser an oder aus ist, kann man nicht verallgemeinern. Gäbe es eine Einstellung, die auf alle Fälle am Besten wäre, bräuchte man wohl keine Einstellungsmöglichkeit für VSync in den Treibern, oder?!


    Prad&Geist haben natürlich insofern recht, daß man perfekt flüssige Animation nur mit angeschaltetem VSync erreicht. ABER DAS GILT NUR, wenn der Rechner (CPU,Grafikkarte, usw) schnell genug ist, um die Frame-Rate des Spieles konstant mindestens so hoch zu halten wie die Vertikalfrequenz der Grafikkarte!!!!


    Denn wenn VSync aktiviert ist, und der Rechner länger als einen Vertikalzyklus zur Berechnung eines Frames benötigt, fällt die Frame-Rate schlagartig auf einen Teiler der Vertikalfrequenz (je nach Last). Das kann sehr unschön sein, z.B. wenn der Rechner _meistens_ schnell genug ist, aber wenn etwas mehr los ist nicht mehr. Dann "stottert" die Animation regelmäßig, und wechselt z.B. dauernd zwischen 60 und 30 fps.


    In einem solchen Falle (und all zu selten ist so ein Fall gar nicht einmal) sollte man besser VSync deaktivieren. Außerdem sollte man VSync für Benchmarks deaktivieren ;)


    Außerdem gibt es noch den Fall, daß ein TFT den Panel-Update mit einer festen, internen Frequenz betreibt. (Ist scheinbar gar nicht so selten.) Dann wird man auch mit aktiviertem VSync noch regelmäßige Ruckler haben, selbst wenn der Rechner schnell genug ist.


    Viele Grüße
    Wilfried

  • also bei Counterstrike gehört die V Sync auf alle Fälle aus, der 100 fps wegen :)

    • Offizieller Beitrag

    Also ich denke auf einen gemeinsamen Nenner werden wir hier nur schwer kommen. Bei mir persönlich steht die Darstellungsqualität im Vordergrund und deshalb würde ich in jedem Fall an sagen. Was natürlich zu berücksichtigen ist, dass eine schnelle Grafikkarte/Rechner vorhanden sind. Da hat wwelti natürlich vollkommen recht. Das hatte ich bei einem Gamer der viel spielt eigentlich vorausgesetzt.

  • Hallo zusammen,


    Prad: Klar, die einzelnen Frames werden nur mit vSync an sauber dargestellt. Aber selbst wenn man eine halbwegs aktuelle Grafikkarte besitzt (und selbst Gamer-Naturen kaufen sich nicht jedes halbe Jahr einen neuen Top-PC mit jeweils schnellster Graka + CPU!): Neue Spiele fordern auch von aktueller Hardware das Letzte, das war schon immer so.


    Daher muß jeder selbst wissen, was ihm wichtiger ist:
    - Perfekt dargestellte Frames und harte Frame-Raten-Wechsel, (vSync an)
    - oder horizontale Frame-Unterteilungen, und "fließende" Frame-Raten-Übergänge (vSync aus)


    Ersteres ist natürlich auf jeden Fall zu empfehlen, wenn die Hardware schnell genug ist.


    Mephisto: Deine 100 fps bringen Dir gar nix wenn Du den Monitor nicht in dem Spiel mit 100 Hz betreibst. Das gibt ne schön beeindruckende FPS-Anzeige, aber keine bessere (oder gar schnellere) Bewegungsdarstellung, als wenn du vSync an hast und alles immer schön synchronisiert läuft.


    Viele Grüße
    Wilfried

  • Jo, thx !


    Dann nehme ich mal den goldenen Mittelweg ;)


    VSync: Standart Einstellung des Treibers !

  • Zitat

    Original von Hoffi
    VSync: Standart Einstellung des Treibers !


    Das bedeutet, dass die jeweilige Anwendung festlegt, ob Vsync an- oder ausgeschaltet ist. Es gibt einige wenige Spiele, wo du das dann im Spielmenü selber einstellen kannst (z.B. Unreal 2).


    Ich erzwinge Vsync durch den Treiber, weil ich das Tearing nicht so gern habe.

  • wwelti: Erst mal danke für die ausführlichen Beschreibungen bisher, ist immer wieder eine Freude die zu lesen !


    Erlaube mir dazu aber noch ein paar Fragen, denn ich denke nur wenn man es richtig verstanden hat, kann man es auch nach den Umständen entsprechend richtig einsetzen:


    Also es sollte jetzt klar sein, dass bei eingeschaltetem VSync die Framerate "qequantelt" einbricht (1:2, 1:4...etc.).
    Aber was macht der Monitor daraus, d.h. zeigt z.B. ein TFT Monitor(60vHz) bei einem Einbruch zu 30fps dann zwei gleiche Bilder, bevor das nächste berechnete ankommt ?


    Im umgedrehten Fall, ist mit VSync dann ausgeschlossen, dass die Graka "zu viele" Frames berechnet.
    Sie wird also auf die VHz Frequenz des Monitors "gebremst", richtig ?


    Eine weitere Frage ist, was passiert bei ausgeschaltetem VSync mit "zuviel berechneten" Frames, d.h. z.B. die Graka berechnet 100fps der Monitor läuft aber nur mit 60vHz ?
    Du hattest in einem anderen Thread geschrieben, dass dann in einem Bild je zur Hälfte ein Frame angezeigt wird, also insgesamt zwei (Tearing). Das kann aber doch nur bei 120fps Graka Output auf einem 60vHz TFT sauber gelingen !
    Die fps Rate variiert aber bei ausgeschaltetem VSync. Also sagen wir mal der TFT Monitor läuft weiterhin mit konstanten 60vHz, die Framerate der Graka liegt aber in einer Momentaufnahme bei z.B. 90fps.
    Wie sieht das Bild jetzt aus ?


    Und, um alle Fälle durch zu kauen, wie sieht das ganze bei zu wenig gelieferten Frames aus.
    Auch da ist wieder imho 30fps der nächst beste Wert, da hier (s.o.) sauber ein Bild zweimal angezeigt werden kann.


    Alles noch sehr verwirrend.



    Neutrino

  • Hallo Neutrino,


    Ok, ich muß zugeben, den Tearing-Effekt hatte ich bis jetzt nicht wirklich präzise beschrieben. Mir ging es allerdings auch eher drum, die "Message" rüberzubringen, als alle Details aufzuzeigen. Naja, das kann ich ja jetzt noch nachholen ;)


    Da bei dieser Geschichte vieles irgendwie zusammenhängt, hole ich mal ein bisschen weiter aus.


    -------------------- 1. Was macht die VGA-Karte? Was ist ein "vSync"? ---------------------------------


    Die Vertikalfrequenz wird von der Grafikkarte "erzeugt". Das funktioniert wie folgt:


    - Ein Taktgenerator auf der Grafikkarte erzeugt den Pixeltakt. Der ist üblicherweise im MHz Bereich. Die Länge eines Pixeltakt-Zyklus bestimmt den zeitlichen Abstand zwischen zwei einzelnen Pixeln, die von der Grafikkarte am VGA (oder DVI)-Ausgang ja sequentiell (hintereinander) ausgegeben werden.


    - Ein Zähler zählt über eine Zeile hinweg die Zyklen des Pixel-Taktes. Immer wenn eine Zeile (inklusive Ränder und unsichtbarer Pixel für den horizontalen Rücksprung des Elektronenstrahls) komplett durchlaufen wurde, wird ein hSync-Impuls erzeugt und der Zähler zurückgesetzt. So wird die sogenannte Horizontalfrequenz gebildet. (Eine Zeile wird immer von links nach rechts durchlaufen)


    - Ein weiterer Zähler zählt die Zeilen. Immer wenn ein komplettes Bild durchlaufen wurde (von oben nach unten, inklusive Ränder und unsichtbarer Zeilen für den vertikalen Rücksprung des Elektronenstrahles) wird ein vSync-Impuls erzeugt und der Zähler zurückgesetzt.


    Während der ganzen Zeit liegen auf den R, G, und B -Kanälen des VGA-Ausgangs Spannungen an, die die jeweilige Farbintensität im aktuellen Pixel signalisieren. So überträgt die VGA-Karte kontinuierlich Bild für Bild; jeweils eines pro Vertikalzyklus. Jedes Bild wird Zeile für Zeile von oben nach unten, jede Zeile wird Pixel für Pixel von links nach rechts übertragen. Für DVI funktioniert das Ganze fast genauso, es werden bloß digitale statt analoger Werte auf den Leitungen für die Farbkanäle übertragen. Allerdings wird bei DVI (auf einer weiteren Leitung) auch der Pixeltakt übertragen, während bei analoger Übertragung außer den Farbwerten nur noch die hSync- und vSync-Impulse übertragen werden.


    Die Grafikkarte holt sich die notwendige Information aus dem Grafikspeicher, der sich meist auf der Grafikkarte befindet. Wie die Information auf der Grafikkarte codiert ist, hängt von der Farbtiefe (genauer: Pixelformat) des gerade aktiven Modus ab. Da gibt es eine ganze Palette: 1 Bit pro Pixel (schwarz/weiß), 2 Bit pro Pixel (CGA, vierfarbig), 4 BPP (EGA, 16 Farben), 8 BPP (VGA, 256 Farben), 16 BPP (65536 Farben), 24 und 32 BPP (beide ca. 16.7 Mio Farben). Zwischen den beiden letzteren gibt es keinen Unterschied, was die Anzahl der Farben angeht. Pro Farbkanal werden maximal 8 Bit pro Pixel ausgewertet. 32 Bit verwendet man hauptsächlich deshalb, weil dies genau der Wortbreite eines 32-Bit Prozessors entspricht. Dies ermöglicht höhere Zugriffsgeschwindigkeiten auf einzelne Pixel und vereinfacht das Design von Grafikprozessoren. Aus diesem Grunde bieten die meisten Spiele nur Einstellmöglichkeiten für 16 Bit oder 32 Bit, nicht jedoch für 24 Bit, obwohl letzteres auch möglich ist. Aber es ist halt langsam.


    Wie auch immer die Information auf der Grafikkarte codiert ist; die Farben werden immer auf dieselbe Art als Spannungs-Werte am VGA-Ausgang codiert. Die Erzeugung dieser Spannungswerte wird von drei parallel laufenden Digital-Analog-Konvertern, dem sogenannten "RAMDAC" vorgenommen. Die müssen ziemlich schnell sein: Ein Pixeltakt von 162 MHz wäre z.B. typisch für 1600x1200 Pixel. Der RAMDAC muß hierbei 162 Millionen mal pro Sekunde aus drei digitalen 8-Bit Werten drei Spannungswerte erzeugen. Intern rechnet die Grafikkarte während der Ausgabe also schon auf digitaler Ebene jede Farbtiefe auf 3x8 Bit um!


    Je nach Grafikmodus ist der Bereich im Grafikspeicher, der für das angezeigte Bild verwendet wird, unterschiedlich groß; die Größe (in Bit) berechnet sich aus Anzahl Pixel*Farbtiefe. Diesen Bereich nenne ich fortan "Bildpuffer".


    Ein bestimmter Grafikmodus definiert sich also letztendlich aus Pixelformat, Pixeltakt, Zeilenlänge (in Pixeln), Bildhöhe (in Zeilen), und den Größen für die Randbereiche und die Rücksprung-Bereiche. Mit entsprechenden Tools unter Windows (Powerstrip) oder mit Modelines (unter Linux) kann man sich auf die Art und Weise fast beliebige eigene Grafikmodi basteln.


    ------------------- 2. Was macht ein Spiel, um den Eindruck von Bewegung zu erzeugen? ----------------------


    Was auf einem Monitor angezeigt wird, ist also die kontinuierliche Folge von Bildern, die von der Grafikkarte übertragen werden. Wenn wir nur das Desktop anzeigen, sind diese Bilder immer (fast) identisch. Um Bewegung zu erzeugen, müssen sich die Bilder jedoch über die Zeit verändern. Das bedeutet, daß der Inhalt des Grafikspeichers kontinuierlich verändert werden muß. Um auf dem Windows-Desktop den Mauszeiger zu bewegen, wird kontinuierlich folgender Zyklus durchlaufen:


    - neue Mausposition ermitteln
    - Rechteckigen Bereich des Desktops an der neuen Mausposition "retten". (aus dem Bildpuffer in einen anderen Speicherbereich (meist auch Grafikspeicher) kopieren)
    - Mauszeiger in diesem Bereich in den Bildpuffer "malen"
    - Ein Weilchen warten (bzw. irgend was anderes tun, z.B. das gerade laufende Programm weiter ausführen)
    - Den Mauszeiger wieder löschen, indem der Bereich wieder zurückkopiert wird.
    - Maus-Zyklus beginnt von vorn


    Daß diese Methode alles andere als perfekt ist, dürfte nicht schwer zu erkennen sein:


    - Direkt nach dem Löschen des Mauszeigers ist kurzfristig kein Mauszeiger im Bildpuffer vorhanden!
    - Wenn irgend etwas auf dem Desktop an der Position der Maus geändert werden soll, muß der Mauszeiger kurzzeitig "ausgeschaltet" werden, da sonst das gerettete Hintergrund-Rechteck nicht mehr korrekt wäre.


    Diese kurzen "Maus-Aussetzer" sind allerdings heutzutage kaum je zu Gesicht zu bekommen, da die PC's einfach so schnell sind, daß das Löschen und Neuzeichnen eines Mauszeigers eine Sache von sehr deutlich weniger als einer Millionstel Sekunde ist. In dieser Zeitspanne werden selbst in hochauflösenden Modi nur ein paar Dutzend Pixel übertragen. Die Wahrscheinlichkeit, daß in dem Moment, in dem die Maus gerade gelöscht ist, an dieser Position Pixel übertragen werden, ist also ziemlich gering.


    - Weiterhin, und das ist wesentlich gravierender, ist der Maus-Zyklus in aller Regel nicht mit dem Vertikaltakt der Grafikkarte synchronisiert. Das bedeutet: Der Maus-Zyklus dauert jeweils z.B. ungefähr eine 50stel Sekunde. Was die Grafikkarte macht, wird dabei jedoch nicht berücksichtigt. Man kann sich nun leicht überlegen, wie die Bildfolge aussieht, die von der Grafikkarte am VGA-Ausgang übertragen wird: Gelegentlich wird die Maus in zwei aufeinanderfolgenden Bildern an derselben Position sein.


    Das menschliche Auge ist "von Natur aus" darauf ausgelegt, bewegte Objekte zu fixieren. Wenn wir die Maus bewegen, folgen wir automatisch mit den Augen dem Mauszeiger. Das Auge geht jedoch von einer einigermaßen gleichmäßigen Bewegung aus. Die aus der fehlenden Synchronisation resultierende Unregelmäßigkeit in der Bewegung empfinden wir deshalb als unnatürlich und störend.


    An die ruckelnde Maus haben sich die PC-User allerdings erstaunlich gut gewöhnt. Ein Zeichen für die enorme Anpassungsfähigkeit des menschlichen Gehirnes. Man beachte: Auf fast allen "alten" Computersystemen (z.B. Atari ST, Amiga, C64) war die Maus synchronisiert!!


    Was machen nun Spiele anders?


    Zum Ersten werden gewöhnlich wesentlich mehr Objekte als nur ein Mauszeiger bewegt. In 3D-Spielen wird sogar grundsätzlich das gesamte Bild immer wieder komplett neu berechnet. Das "Aussetzer-Problem", welches beim Mauszeiger kaum jemals wahrzunehmen ist, nimmt hier völlig andere Dimensionen an: Die Berechnung eines Bildes für ein 3D-Spiel läuft gewöhnlich so, daß zuerst das komplette alte Bild gelöscht wird, um dann Objekt für Objekt (bzw. Polygon für Polygon) das neue Bild aufzubauen. Ein solches komplettes Bild nennt sich "Frame". Die Anzahl der Frames, die pro Sekunde aufgebaut werden, nennt sich "Frame Rate", und wird in "Frames per second", kurz fps, gemessen. Ein solches Frame zu berechnen, ist eine der aufwändigsten Aktionen in einem Spiel. Daher sinkt häufig die Frame-Rate drastisch, wenn in dem Spiel gerade viel los ist: Der Computer schafft es einfach nicht mehr, die Frames schneller zu berechnen.


    Man stelle sich nun vor, dies alles würde direkt im Bildpuffer stattfinden. Das Ergebnis wäre ein grauenhaftes Geflacker, denn die meiste Zeit befindet sich das Bild im Aufbau. Die Bildausgabe der VGA-Karte findet jedoch während der ganzen Zeit statt. Es wäre also purer Zufall, wenn an der Stelle, an der die VGA-Karte gerade den Bildspeicher ausliest, gerade ein fertig berechnetes Bild ist.


    Aus diesem Grund wird in fast allen Spielen "Double-Buffering" verwendet: Man verwendet einen primären Puffer (=Bildpuffer), und einen Hintergrund-Puffer. Im Hintergrundpuffer wird in aller Ruhe das nächste Bild aufgebaut, während im primären Puffer das vorherige Bild in voller Pracht angezeigt wird. Sobald das neue Bild fertig ist, wird ein Seitenwechsel (page flip) ausgeführt: Damit wird der Hintergrundpuffer zum neuen primären Puffer erklärt, der alte primäre Puffer wird zum Hintergrundpuffer. Die Grafikkarten sind in der Lage, jederzeit eine solche Änderung der Addresse des Bildpuffers durchzuführen! Die laufende Bildausgabe wird dann nahtlos an derselben Pixelposition im neuen Bildpuffer weitergeführt.


    -------------------- 3. Wie hängen vSync und Tearing zusammen? -------------------------


    Und hier sind wir auch beim Thema angelangt. Denn genau wenn das passiert, haben wir die Situation, daß "mitten im Bild" von einem Frame zum nächsten gewechselt wird. Das Bild, welches von der VGA-Karte übertragen wird, hat somit (irgendwo) eine horizontale Teilung; oberhalb ist das ältere, unterhalb das neuere Frame sichtbar.


    Wenn die Frame Rate nun wesentlich höher als die Vertikalfrequenz ist (z.B.: Vertikalfrequenz 60 Hz, Frame Rate 150 Hz), treten sogar grundsätzlich mehr als ein Page-Flip pro Vertikalzyklus auf; damit haben wir pro Bild der VGA-Karte mehrere Unterteilungen in verschieden alte Frames!


    Wenn die Frame Rate niedriger als die Vertikalfrequenz ist, haben wir gelegentlich auch Bilder ohne Unterteilung.


    Dieser Effekt nennt sich auch "Tearing", da die Frames durch die Unterteilungen regelrecht "zerrissen" werden. Dies tritt immer und grundsätzlich auf, wenn die vertikale Synchronisation deaktiviert ist.


    Wenn die vertikale Synchronisation aktiviert ist, dann bedeutet dies, daß beim Page-Flip grundsätzlich gewartet wird, bis der nächste vSync-Impuls erzeugt wird. Es wird also immer darauf gewartet, bis die VGA-Karte die Übertragung eines kompletten Bildes beendet hat, um genau in der kurzen Pause zum nächsten Bild den Seitenwechsel vorzunehmen. So wird erreicht, daß grundsätzlich nur komplette Bilder übertragen werden, und kein Tearing auftritt.


    -------------------- 4. Wir spielen ein bisschen Counter-Strike. -------------------------


    Nehmen wir nun der Einfachkeit halber an, wir spielen Counter-Strike. Der Grafik-Modus ist 640x480 Pixel bei 100 Hz, vSync ist aktiviert. Wir verwenden einen Pentium 500 mit GeForce. Wenn gerade nicht viel los ist, braucht der Computer ungefähr 0.007 Sekunden, um ein Frame zu berechnen. Damit könnte er theoretisch 142 fps schaffen. Doch die vertikale Synchronisation zwingt CS dazu, bei jedem Page-Flip auf den vSync-Impuls zu warten, bevor mit dem nächsten Frame angefangen werden kann! Der Rechner langweilt sich also jeweils 0.003 Sekunden lang, bis die Grafikkarte das aktuelle Frame fertig übertragen hat. Die Frame Rate beträgt somit 100 Hz, und ist identisch mit der Vertikalfrequenz.


    Wir laufen um eine Ecke, und plötzlich steht ein Gegner vor uns. Eine Spielfigur muß nun zusätzlich zum Hintergrund dargestellt werden, außerdem benötigt die CPU mehr Leistung für die Kollisionstests. Damit dauert die Berechnung eines Frames nun etwas länger, sagen wir: 0.011 Sekunden. Damit schafft es der PC gerade eben nicht mehr, ein Frame innerhalb eines Vertikalzyklus zu erstellen! Das bedeutet, der Page-Flip verpasst jeweils einen vSync-Impuls knapp und muß 0.009 Sekunden auf den nächsten warten. Jedes Frame wird also zweimal von der Grafikkarte übertragen. Zwischen zwei Frames vergehen nun immer 0.02 Sekunden, die Frame Rate hat sich also glatt halbiert auf nur noch 50 fps!


    Dies passierte sehr plötzlich. Der Unterschied ist deutlich spürbar (jawoll, selbst bei so hohen Frame-Raten!) daher haben wir vor Schreck nicht schnell genug reagiert und wurden vom Gegner erwischt. Damit wechseln wir in den Ghost-Modus, und sehen zusätzlich unsere eigenen sterblichen Überreste. Außerdem kommen noch ein paar weitere Gegner um die Ecke. Damit wird die Belastung für den PC nochmals höher: Er benötigt nun 0.023 Sekunden pro Frame. Was resultiert daraus? Jedes Frame wird 3x angezeigt, die Frame Rate sinkt auf 33.33 Hz.


    Wäre nun auf diesem PC vSync deaktiviert gewesen, wäre die Frame-Rate immer genau so hoch gewesen, wie es der PC gerade eben schafft. Die Übergänge zwischen hoher und niedriger Frame-Rate wären wesentlich weniger aprupt. Das ist der Vorteil von deaktiviertem vSync. Der Nachteil: Wir haben Tearing. Und aufgrund des Tearing werden die meisten Frames "zerrissen" dargestellt. Weiterhin: Wollten wir einem sich gleichmäßig bewegenden Objekt mit den Augen folgen, würden wir erkennen, daß aufgrund des Tearing die Bewegung nicht mehr gleichmäßig ist: Wenn die Frame-Rate höher als die Vertikalfrequenz ist, "überspringt" das Objekt gelegentlich einen Schritt seiner Bewegung. Ist die Frame Rate niedriger, wird gelegentlich ein Schritt der Bewegung doppelt (oder noch öfter) angezeigt. Auf jeden Fall ist die Gleichmäßigkeit der Bewegung nicht mehr so gegeben, als wenn vSync aktiv wäre.


    So, damit ist mein kleiner Roman über vSync zu Ende. Ich hoffe, jemand hat es geschafft, bis hier durchzuhalten ;)


    P.S.: Irgendwo habe ich garantiert ein paar Fehler eingebaut. Bitte melden, ich korrigiere das dann umgehend 8)


    Viele Grüße
    Wilfried