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