*Markus: Kniffliges Zeit-Logik-Problem

Beitrag lesen

Hallo,

ich habe eine Animation, zusammengesetzt aus Grafiken, die in einem bestimmten Zeitraum ablaufen soll. In meinem Beispiel soll jede Sekunde genau das nächste Bild angezeigt werden.
Zuerst mal versuchte ich den Timer alle 1s zu aktualisieren, wodurch die Grafik tatsächlich jede Sekunde aktualisiert wurde.
Es ist natürlich so, dass man auch andere Sachen zu anderen Aktualisierungszeiten animieren will, wodurch irgend eine Logik her muss, die bei einem schnellen Timer weiß, wann die Grafik zu aktualisieren ist. Dies wollte ich folgendermaßen bewerkstelligen:

  
public static final int PERIOD = 100; //Alle 0,1s wird der Thread aktualisiert  
private int currentThreadCounter = 0;  
private static final int MAXPERIODCYCLE = 3000;  //Nach dieser Zeit in ms wird der Zyklus wieder von vorne gestartet..  
//da sonst der Richt-Counter bis ins nendliche laufen würde..  
.  
.  
zahlenPlayer = new ImagePlayer(zahlenImages, 1000); //2. Paramter ist die Aktualisierungszeit, d.H alle 1000 ms  
  
new Timer(PERIOD, this).start();  
.  
.  
.  
public void actionPerformed(ActionEvent ev) {  
 zahlenPlayer.updateAnimation(currentThreadCounter);  
 repaint();  
  if (currentThreadCounter + PERIOD <= MAXPERIODCYCLE)  
      currentThreadCounter += PERIOD;  
  else  
   currentThreadCounter = 0;  
 }  
.  
.  
.  
------------------------------- Die Klasse ImagePlayer mit der methode updateAnimation --------  
import java.awt.image.BufferedImage;  
  
public class ImagePlayer {  
  
 private BufferedImage[] imglist;  
 private int lastPicture;  
 private int currentPicture;  
 private int updatePeriod;  
  
 public ImagePlayer(BufferedImage[] imglist, int updatePeriod)   {  
  this.imglist = imglist;  
  this.updatePeriod = updatePeriod;  
  currentPicture = 0;  
  lastPicture = imglist.length-1;  
 }  
  
 public void updateAnimation(int currentThreadCounter)   {  
// ...!= 0 deswegen, da sonst sofort das erste Bild unmittelbar nach dem letzten gezeichnet werden würde.  
   if ( (currentThreadCounter != 0) && (currentThreadCounter % updatePeriod == 0) )  
   if (currentPicture + 1 <= lastPicture)  
    currentPicture++;  
   else  
    currentPicture = 0;  
 }  
  
 public BufferedImage getCurrentPicture()   {  
  return imglist[currentPicture];  
 }  
}  

Im Prinzip funktioniert es auch so, wie ich es mir vorstellte, aber einen Fehler hat das Ganze. Meine Animation ist zu langsam, d.H. beim Vergleich mit einer richtigen Uhr merkt man nach einiger Zeit, dass die Sekunden schneller vergehen als in meinem Programm. Wie kommt das zustande? An der CPU-Auslastung, o.ä. kann's nicht liegen, da die CPU nur zu ~20% belastet ist auf meinem 1.8GHZ-Rechner.
Woran liegt diese Verzögerung?

Markus