V-Sync

Aus DGL Wiki
Version vom 6. Dezember 2013, 10:02 Uhr von Glawesome (Diskussion | Beiträge) (V-Sync aktivieren: Fehler bei glXSwapIntervalEXT behoben)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche
Hinweis: Diesem Artikel sollten folgende Bilder beigefügt werden:

(Mehr Informationen/weitere Artikel)
Bildwunsch.jpg
Ein Beispielbild mit Tearing

V-Sync (auch vertikale Synchronisation) ist eine Technik, die mit dem Tauschen von Back- und Frontbuffer wartet, bis die Grafikkarte vom Monitor ein Signal bekommt, dass dieser mit dem Auslesen des Frontbuffers fertig ist.

Tearing

Tearing ist ein unerwünschter Effekt, der auftreten kann, wenn V-Sync nicht aktiviert ist. Er entsteht dadurch, dass der Inhalt des Backbuffers in den Frontbuffer geschrieben wird, während letzterer noch an den Bildschirm übertragen wird. Die Bilddaten des Frontbuffers werden in der Regel von oben nach unten an den Monitor übertragen. Wird der Frontbuffer während dieses Vorgangs aktualisiert, so zeigt der Bildschirm in der oberen Hälfte noch das alte Bild, während der untere Teil schon das neue Bild anzeigt. Gerade bei schnellen Kameraschwenks kann das Bild dadurch "zerrissen" aussehen.

V-Sync aktivieren

Wer V-Sync in seinem Programm aktivieren will, ruft dazu je nach Betriebssystem wglSwapIntervalEXT oder glXSwapIntervalEXT auf:

// Windows
wglSwapIntervalEXT(1); // aktivieren
wglSwapIntervalEXT(0); // deaktivieren

// Linux
glXSwapIntervalEXT(dpy, glXGetCurrentDrawable(), 1); // aktivieren
glXSwapIntervalEXT(dpy, glXGetCurrentDrawable(), 0); // deaktivieren

Dazu sind die Extensions WGL_EXT_swap_control bzw. GLX_EXT_swap_control notwendig.

Wer SDL einsetzt, kann V-Sync auch anders aktivieren. Dazu wird SDL_GL_SetAttribute mit dem Argument SDL_GL_SWAP_CONTROL aufgerufen:

SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1); // aktivieren
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0); // deaktivieren

Wichtig ist, dass dieser Aufruf geschieht, bevor SDL_SetVideoMode aufgerufen wird.

Auswirkungen auf die Framerate

V-Sync begrenzt die Framerate auf die Refreshfrequenz des Bildschirms. Unter bestimmten Umständen kann die Framerate aber noch weiter begrenzt werden. Mehr dazu erfahrt ihr hier.