|
Seitenumschaltung
- Flip |
|
Sicherlich
haben Sie schon einmal erlebt, dass bei der Programmierung
von Windows-Anwendungen, dort wo große Grafikmengen
gezeichnet werden, das Bild begonnen hat zu flackern.
Dieses Problem ist als Tearing (sich
selbst überholen)
bekannt, und tritt auf, wenn in einen Bildabschnitt
gezeichnet wird, der gerade dargestellt wird.
|
Wie
entsteht dieses Tearing?
Schauen wir uns einmal an, wie das Bild auf dem Monitor gebracht wird. Obwohl
es so aussieht als würde das Bild als Ganzes
gezeichnet, wird es in Wirklichkeit ständig, etwa 60 mal pro Sekunde oder öfter,
neu gezeichnet.
Dies erzeugt beim Betrachter den Eindruck der konstanten
Darstellung. Dies liegt an der Art, wie unsere
Retina auf sehr schnelle Änderungen des Lichts
reagiert. Wenn wir sehen könnten, was wirklich
passiert, dann wäre das ganze Bild nichts anderes
als ein bewegter Lichtpunkt.
|
Dieser
Punkt wird durch einen Elektronenstrahl erzeugt, der
auf eine phosphoreszierende Beschichtung der Rückseite
des Monitorglases trifft. Das Bild wird von links
oben beginnend gezeichnet, Zeile für Zeile, von links nach
rechts. Sind alle Zeilen gezeichnet, beginnt es wieder
in der linken oberen Ecke. Die Schnelligkeit, in der dies geschieht,
wird als Vertikalfrequenz oder vertikale
Bildwiederholfrequenz (vertical refresh)
bezeichnet.
|
Um
beim Rücklauf des Punktes in die linke obere Ecke
nicht eine diagonale Linie zu hinterlassen, wird der
Strahl abgeschaltet. Dieser Zeitraum wird vertical
blanking interval (vertikaler Strahlrücklauf)
oder VBI bezeichnet. In dieser Zeit können
Bilder gezeichnet werden ohne das ein Flackern auftreten
kann.
|
Leider
ist es nun nicht so einfach, auf diesen Moment zu
warten um alle Bilder ohne flackern zu zeichnen. Der
Zeitraum würde nie ausreichen und die Bildwiederholung
würde uns jedes Mal wieder einholen.
|
Deshalb
bereitet man die Arbeit vorher vor anstatt direkt
in die primäre Oberfläche zu zeichnen. Dazu
erstellt man eine sekundäre Oberfläche im
Videospeicher, einen BackBuffer (nicht
sichtbarer Bereich des Bildspeichers).
In diesem kann das Bild vorbereitet werden, während
das vorhergehende noch angezeigt wird. Kommt der nächste
Strahlrücklauf, werden die beiden Oberflächen
einfach ausgetauscht. Das neue Bild ist auf dem Monitor
lange bevor der Intervall beendet ist. Diese Technik
wird als Doppel-Puffer (double buffering)
bezeichnet und wird meistens verwendet.
|
Um
einen Doppel-Puffer einzusetzen, muss eine
zweite Oberfläche im Videospeicher erstellt werden,
die identisch mit der primären Oberfläche
ist. Diese Sammlung von Oberflächen wird als Umschaltungskette
bezeichnet. Um solch eine Kette zu erstellen, muss die Anzahl der Puffer beim Erstellen der primären
Oberfläche angegeben werden.
|
|
|
Sub Initialization()
'Holen wir uns den Zugriff auf das DirectDraw-Objekt.
'Der leere String-Parameter bedeutet,
'dass der aktive Bildschirmtreiber benutzt werden soll
Set DD7 = DX7.DirectDrawCreate("")
'Die Anwendung soll im VollbildModus laufen
DD7.SetCooperativeLevel Me.hWnd, DDSCL_EXCLUSIVE Or _
DDSCL_FULLSCREEN Or DDSCL_ALLOWREBOOT
'Auflösung und Farbtiefe deklarieren
DD7.SetDisplayMode 800, 600, 16, 0, DDSDM_DEFAULT
'Beschreibung des PrimarySurface mit einem BackBuffer
With SurfaceDesc
.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT
.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE Or _
DDSCAPS_FLIP Or DDSCAPS_COMPLEX
.lBackBufferCount = 1
End With
'PrimarySurface initialisieren auf dem alles abgebildet wird
Set PrimarySurface = DD7.CreateSurface(SurfaceDesc)
'Für die Beschreibung des Backbuffers benötigen wir nur
'den ddsCaps-Bereich
SurfaceDesc.ddsCaps.lCaps = DDSCAPS_BACKBUFFER
'BackBuffer initialisieren in dem alles gezeichnet und dann
'in die PrimarySurface ge'flipt wird
Set BackBuffer = _
PrimarySurface.GetAttachedSurface(SurfaceDesc.ddsCaps)
End Sub
|
|
|
Einsatz
der Seitenumschaltung
|
Der Einsatz
ist sehr einfach. Zunächst werden alle Bilder
in den BackBuffer gezeichnet. Wenn das Bild
fertig ist, wird die Flip()-Funktion der primären
Oberfläche aufgerufen.
|
Die Funktion
bewirkt den Austausch der primären Oberfläche
mit dem BackBuffer. Dies geschieht aber nicht
sofort, sondern erst beim nächsten Strahlrücklauf.
Danach können wieder Bilder in den BackBuffer
gezeichnet werden.
|
|
|
PrimarySurface.Flip Nothing, DDFLIP_WAIT
|
|
|
Ein
Beispiel für den Einsatz des Doppel-Puffers
können Sie hier downloaden.
|
|
|
Download
tip0194.zip
(6,9 kB) |
|
Downloads
bisher: [ 2106
] |
|
|