Mit Einführung der Doublebuffering-Technik (changebuffer) ist dieses Problem inzwischen praktisch gelöst (Januar 2007).

Das VBL-Task Problem - gelöst

In xtekplot gibt es noch ein schwerwiegendes ungelöstes Problem.
Davon betroffen ist insbesondere die Linux-Version.
Für die Mac-Version ist es jetzt weitgehend gelöst.

Hintergrund

Bei einer bewegten Grafischen Darstellung (Animation) wäre es wichtig dass das neue Bild jeweils gezeichnet wird wenn der Rasterstrahl gerade nicht sichtbar ist (Austastlücke).
Andernfalls gibt es meist unschöne Flimmereffekte. Für fliessende Bewegungen sollte auch noch wirklich vor jedem neuen Bildschirmaufbau die neuen Positionen der bewegten Objekte gezeichnet werden. Wird ein Objekt nur vor jedem zweiten Bildaufbau neu positioniert so ist ein Geisterbild zu sehen (optische Täuschung).
Um beide Effekte zu verhindern muss also genau in jeder Bildschirmlücke das Bild neu aufgebaut und gezeichnet werden.
Mit der Methode des "double buffering" kann die Zeit eines Bildschirmaufbaus dazu genutzt werden das Bild neu zu berechnen und in den gerade nicht sichtbaren Bildspeicher zu zeichnen. Dann braucht nur das Umschalten zwischen den beiden Bildspeichern in der Austastlücke zu geschehen.

Lösungsansätze

Auf den Amiga-Computern (klassische Linie) ist das Problem ziemlich elegant gelöst.
Es gibt dort eine Systemfunktion WaitTOF (Wait Top Of Frame) die auf einen Neuaufbau des Bildes wartet. Zudem gibt es noch WaitBOF (Wait Bottom Of Frame) um auf das Ende des Bildaufbaus zu warten und eine Funktion um auf eine beliebige Position des Rasterstrahls zu warten.
Die Hersteller der neueren Grafikkarten scheinen diese Lösung jedoch nicht zu kennen (vielleicht kennen die auch das Problem nicht !?).

Auf Macintosh-Computern gibt es auch eine recht gute Lösung (auf die man erst aber mal kommen muss). Hier ein entsprechendes Beispiel auf MAC
Dank einem Hinweis von einer News-Gruppe funktioniert dies jetzt auch auf dem neuen PowerMAC G4.

Bei QNX könnte das Problem auch schon gelöst sein. Jedenfalls sehen Animationen mit dem QNX-Demo auf einem IBM-PC absolut fliessend aus.

Unter Linux (und andere Unix-Varianten) suche ich noch nach einer Lösung. Über ein Netzwerk mit X wird es wohl keine Lösung geben (Netzwerke werden dazu wahrscheinlich immer zu langsam sein). Für ein lokal laufendes Programm müsste es aber möglich sein.

Wie das Problem in Java gehandhabt wird weiss ich noch nicht.

Beispielprogramme

Beispiel auf MAC

Auf den MACs scheint das VBL-Problem jetzt gelöst zu sein:
Man verwendet dort die Strukturen VBLtask und VBLRec, und definiert sich eine Interruptfunktion my_vbltask die nach Aufruf von SlotVinstall jeweils bei jeder Austastlücke aufgerufen wird.
Ich habe das Ganze mal in einem Beispielprogramm zusammengefasst (zum entpacken braucht man MacLHA 2.13).
Dieses Beispiel läuft jetzt richtig auf PowerMAC6100, Performa475 und PowerMAC-G4/400MHz (Josmite), und hoffentlich auch auf andern Modellen.
Das inzwischen gelöste Problem auf dem PowerMAC-G4 war die richtige Slotnummer herauszufinden. Dies wird jetzt mit der Funktion GetVideoSlotFromGDevice() gemacht.
Wer es auf einem andern Modell zum laufen bringt, oder Probleme damit hat kann mir eine email schicken: pfister@pci.unizh.ch

Provisorische Lösung in xtekplot

In xtekplot gibt es die Funktionen waitTOF und waitBOF.
Diese Funktionen funktionieren aber bisher nur in der Amiga-Version richtig (dort werden die entsprechenden Systemfunktionen aufgerufen).

Auf Macintosh funktioniert eine dieser beiden Funktionen richtig, die andere funktioniert fast richtig.

Notlösung unter unix (Linux): es wird die Funktion usleep aufgerufen die dann etwa 1/50 Sekunden wartet.

Notlösung auf andern Macintosh-Modellen:
Statt der Funktion SlotVinstall wird die Funktion Vinstall benutzt (entsprechende #define in mtekplot.cc setzen). Diese erzeugt etwa alle 1/60 Sekunden einen Interrupt.

Alle diese Notlösungen laufen unabhängig von der Grafikkarte, und können somit auch nicht die Synchronisierung erreichen.
Immerhin laufen damit wenigstens die meisten Programme, wenn auch mit Flimmer- und Geister-Effekten.


Anmerkungen

Mit Austastlücke oder auch Bildschirmlücke ist der Zeitabschnitt, in der der Rasterstrahl (eines klassischen Bildschirms) vom untern zum oberen Rand des Schirms zurückkehrt, gemeint.
Dies wird auch als "Zeilenrücksprung" bezeichnet, was insofern etwas verwirrend sein kann als dass der Rasterstrahl ja auch nach jeder Zeile vom rechten Rand zum linken "zurückspringt".
Es ist jedoch immer der Rücksprung von unten rechts nach oben links gemeint (so auch in der xtekplot-Dokumentation).
Last update: 4-Nov-99 / RPF