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 BitmapBlt.zip Download
tip0194.zip
 (6,9 kB)
Downloadzeit: <1 Min. - 28.8k / <1 Min. - ISDN Downloads bisher: [ 2106 ]

Startseite | VB-/VBA-Tipps | Projekte | Tutorials | API-Referenz | Komponenten | Bücherecke | Gewinnspiele | VB-/VBA-Forum | DirectX-Forum | VB.Net | .Net-Forum | Foren-Archiv | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report

Letzte Aktualisierung, Samstag, 13. April 2002