Dimitri Rettig: Animation ruckelt

Hallo,

ich habe eine Reihe von Threads, die endlos Berechnungen für eine Grafik anstellen. Die vorletze Anweisung in der while (true) Schleife ist der Aufruf von repaint (int x1, int y1, int x2, int y2) in einem Canvas. Danach kommt sleep (100); In der paint-Methode des Canvas wird auf die von den Threads neu berechneten Daten zugegriffen und daraus ergibt sich die Grafik. Die Methode repaint (int x1, int y1, int x2, int y2) ist die Methode für die "Animation", d. h. ein Grafikteil, für den der Thread zuständig ist, wird von (x1; y1) nach   (x2; y2) verschoben. Es funktioniert alles, ausser dass das Bild fürchterlich flimmert. Wie kann man dieses Problem umgehen?

Vielen Dank.

Mit freundlichen Grüßen
   Dimitri Rettig

--
Meistens gelangen die Menschen nur durch die Folgen der Unordnung zur Einführung der Ordnung, und Gesetzlosigkeit führt gewöhnlich erst zu Gesetzen.
  -- Friedrich Schiller
  1. Hi,

    also ich habe sowas früher in Assembler mit Double Buffering gemacht, d.h. mit zwei Gfx-Speicherbereichen. Die Berechnungen werden abwechselnd in den ein oder anderen, gerade nicht sichtbaren Bereich gemacht, anschließend wird umgeschaltet. Mit entsprechendem Timing sollte es dann nicht mehr flimmern.

    MfG
    Danny

  2. Hallo,

    ich habe eine Reihe von Threads, die endlos Berechnungen für eine Grafik anstellen. Die vorletze Anweisung in der while (true) Schleife ist der Aufruf von repaint (int x1, int y1, int x2, int y2) in einem Canvas. Danach kommt sleep (100); In der paint-Methode des Canvas wird auf die von den Threads neu berechneten Daten zugegriffen und daraus ergibt sich die Grafik. Die Methode repaint (int x1, int y1, int x2, int y2) ist die Methode für die "Animation", d. h. ein Grafikteil, für den der Thread zuständig ist, wird von (x1; y1) nach   (x2; y2) verschoben. Es funktioniert alles, ausser dass das Bild fürchterlich flimmert. Wie kann man dieses Problem umgehen?

    Such mal nach Beispielen für Java AWT Double Buffering. Der Trick ist, alle Veränderungen innerhalb eines zweiten Grafik-Kontext (Graphics buf) zu zeichnen. Die einzelnen kleinen Veränderungen verursachen nämlich das Flackern. Erst, wenn alles gezeichnet ist, wird aus dem gesamten Graphics buf mit createImage() das Image offScreenBuffer erzeugt. Dieses wird dann in einem Stück in den sichtbaren Grafik-Kontext gezeichnet.

    Hier ist ein Beispiel, welches dafür eine eigene Klasse DBApplet erzeugt, in der es eine gepufferte Methode public void update(Graphics g) gibt.

    http://developer.java.sun.com/developer/technicalArticles/Interviews/DoubleBuffering/

    viele Grüße

    Axel

  3. Hallo,

    ich habe jetzt zwar keine Lösung parat, aber ich werfe mal als Stickwort "Double Buffer" in den Raum.

    Gruß
      MichaelB