vsync [Solved]
-
hallöchen,
jeder kennt ja sicher das feature in spielen, vsync zu aktivieren.
vsync synchronisiert die Zeichenroutinen mit dem Rasterstrahl des Monitors um kleine, aber unschöne Bildfehler zu vermeiden.Mich würde nun interessieren, wie ich sowas in einer normalen WinAPI-Anwendung umsetzten kann, die auch nur in einem normalen Fenster (kein Fullscreen) läuft.
Es geht darum, dass ich im Clientarea einiges zeichne.
Um Flackern zu vermeiden, habe ich bereits die WM_ERASEBKGND abgefangen, so kommt das Hintergrund nicht mehr beim neuzeichnen kurz durch.
Außerdem verwende ich einen DoubleBuffer, in den ich zeichne.
Dieser wird dann am Ende auf das Fenster geblittet.Mit diesen beiden Methoden habe ich das Flackern auch schon sehr minimiert.
Trotzdem gibt es noch unschöne Effekte, wenn sich von einer Ellipse (ich zeichen paar Ellipsen ;-)) die Farbe ändert vom einem zum anderen Frame, wenn zufällig gerade der Rasterstrahl innerhalb dieser Ellipse ist.Dann sieht man oben noch die alte Farbe und unten schon die neue.
erst beim nächsten durchlauf des strahl wird alles in der neuen farbe angezeigt.um das zu vermeiden, wüsste ich gerne, ob ich irgendwie den vertikalen Rücklauf des Rasterstrahl ermitteln kann, um genau in diesem Moment zu zeichen.
wäre schön, wenn ihr mir hier helfen könntet

schonmal danke
MfG DrakoXP
-
leider musste ich feststellen, dass vsync mit GDI nicht zu erreichen ist.
letztendlich habe ich ein Workaround über DirectDraw eingebaut.ich zeichne zwar über GDI, verwende aber IDirectDraw::WaitForVerticalBlank zum synchrinisieren.
MfG Drako
-
Äh, Rasterstrahl? Und bei TFTs?
Wir schreiben 2009.57Schneller als BitBlt geht es wohl nicht.
DirectDraw

Ist das denn so wichtig?
-
Flackor0r schrieb:
Äh, Rasterstrahl? Und bei TFTs?
Natürlich auch bei modernen TFTs.
Salopp ausgedrückt:
Vsync ist aus der Sicht des Software-Entwicklers letztendlich nur ein Interrupt, der bei jedem Beginn der Übertragung der Pixeldaten eines Vollbildes ausgelöst wird.
D.h. wird ein Monitor mit 60Hz angesteuert, so tritt alle 0,01667s (also 1/60Hz) der Vsync-Interrupt ein.Flackor0r schrieb:
Ist das denn so wichtig?
Ob das notwendig ist, kann ich nur im Bereich der sehr schnellen Bildänderungen vermuten.
Dies ist häufig bei grafikintensiven 3D-Spielen der Fall. Dadurch kann ein unerwünschtes Überlagern der alten Bilddaten mit den neuen Bilddaten während des Bildaufbaus im Monitor unterdrückt werden. -> weniger Artefakte!Alles klar?
Martin
-
Ist auch bei 2D Spielen oder sogar bei Video-Darstellung wichtig, da es sonst zu "tearing" kommen kann.