tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
1064
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    d4rkY89 d4rkY89 ist offline Mitglied Silber
    Registriert seit
    May 2008
    Beiträge
    72
    Hallo.
    Ich habe hier ein kleines Problem. Und zwar programmier ich gerade ein kleines Lernspiel. Die Animationen werden durch einen Thread ausgeführt, welcher am Ende ein paar Milisekunden mit der Funktion "Thread.sleep()" warten soll um auf eine bestimmte FPS zu kommen. Dieser "Timeout" wird dynamisch Berechnet. Der Wert stimmt auch soweit immer. Das einzige Problem ist nun, dass der Thread beispielsweise 20 Milisekunden warten soll, statt dessen aber 32 ms wartet. Auch wenn ich manuell 20 ms an Thread.sleep(20) übergebe, messe ich an der Stelle einen Timeout von 32 ms. Dadurch wird das Ganze eben wesentlich langsamer Abgespielt.

    Hier habe ich mal die Stelle rauskopiert, an der der Thread warten soll:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    long totalTimeOut = Math.round(1000.0d / FPS);
    long timeOut = totalTimeOut - (System.currentTimeMillis() - startTime);
    System.out.println("Timeout: " + timeOut);  // Bei 50 FPS kommen hier 20 ms raus (momentan gibts nicht viel zu Berrechnen deshalb der ziemlich genaue wert von 20 ms bei 50 FPS)
     
    long time = System.currentTimeMillis();
    if(timeOut > 0)
        Thread.sleep(timeOut);
     
    System.out.println("Total Timeout: " + (System.currentTimeMillis() - time));  //Hier messe ich allerdings 32 ms

    Vielleicht hat ja jemand von euch eine Idee, woran es liegen kann. Andere Lösungsvorschläge, an dieser Stelle eine Pause von [timeOut] ms einzuhalten sind mir auch Willkommen.
    Vielleicht kann mir ja jemand, der Erfahrung mit 2D Animationen hat, diese mit mir teilen und mir erklären, wie er das Animationsproblem löst. Da ich dachte es wäre ziemlich unschön für jede Bewegung, die in Kraft tritt, einen Thread zu erstellen hab mich eben dafür entschieden das ganze in einem Thread zu bearbeiten. Für mich ist das jedoch Neuland und deshalb würde ich gerne wissen, die man so etwas relativ schön und sauber macht.
    Geändert von d4rkY89 (12.03.10 um 20:33 Uhr)
     

  2. #2
    Avatar von miffi
    miffi miffi ist offline Mitglied Gold
    Registriert seit
    Jul 2009
    Ort
    Ravensburg (BW)
    Beiträge
    139
    Howdie.

    Zum Thema Thread.sleep(long timeout):
    Dieser Aufruf bedeutet keineswegs, dass exakt die Zeit des Timeouts gewartet wird - es handelt sich nur um die Mindestzeit. Der Aufruf von sleep ist eine höfliche Bitte an den Thread-Scheduler, den gewünschten Thread möglichst nah an der Mindest-Zeit wieder Laufzeit zuzuweisen. Es kann im schlimmsten Fall sogar vorkommen, dass dein Thread für die nächsten 10 Minuten (i.d.R. natürlich nicht, aber die Botschaft soll klar sein) nicht mehr läuft, falls beispielsweise die Priorisierung dementsprechend eingestellt ist.

    Gibts es bei Java2D echt keine Methoden, um die FPS einzustellen? Ich hab auf dem Gebiet leider keine Erfahrung.

    Gruß und viel Erfolg
    miffi
     
    "A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
    Douglas Adams

  3. #3
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Ihr könnt mal versuchen die Runnable durch nen TimerTask aufzurufen, ich weiß zwar nicht ob das viel besser hinhaut, da ich ihm sehr selten benutze, aber möglicherweiße ist es besser.
    Wobei das mit den dynamischen TimeOut auch so eine Sache ist, da ich oft gehört habe, dass die MS/NS-Rückgabewerte von Java (vom OS abhängig) auch recht ungenau sind.

    PS: Statt Thread.sleep lieber TimeUnit.MILLISECONDS.sleep(long);, rechnet bei einen anderen Enum-Feld um.
     
    Mein kleiner webstart Projektplaner:
    http://178.77.101.236/ppws/
    Ideen, Verbesserungsvorschläge, Bugsmeldungen und allg. Kritik erwünscht und erbeten.

    Danke. :)

  4. #4
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Ups, sorry für den Doppelpost. ._."
     
    Mein kleiner webstart Projektplaner:
    http://178.77.101.236/ppws/
    Ideen, Verbesserungsvorschläge, Bugsmeldungen und allg. Kritik erwünscht und erbeten.

    Danke. :)

  5. #5
    d4rkY89 d4rkY89 ist offline Mitglied Silber
    Registriert seit
    May 2008
    Beiträge
    72
    Hey danke für die Infos.
    Ich habe im Internet was ganz Nettes gefunden, womit man den Umgang mit Java 2D relativ gut lernen kann. Jedenfalls ist es genau das, wonach ich gesucht habe

    Hier habe ich mal den Link für alle, die vielleicht auch in Zukunft lust haben ein 2D Spiel zu programmieren. Das ganze wird anhand des Klassikers "Space Invaders" gezeigt

    Das ganze kann man sogar gut verstehen, wenn man sich nur den Source-Code durchließt, welcher gut dokumentiert ist.

    > Klick mich <
     

Ähnliche Themen

  1. IE a:hover funktioniert nicht korrekt!
    Von mR.fLopPy im Forum CSS
    Antworten: 12
    Letzter Beitrag: 04.12.09, 20:59
  2. Thread.sleep(400) ; kehrt nicht zurück
    Von Lastlord im Forum Java Grundlagen
    Antworten: 4
    Letzter Beitrag: 13.07.09, 12:19
  3. Thread.Sleep(); in Flex?
    Von Wanabe_Flex im Forum Adobe Flex & AIR
    Antworten: 1
    Letzter Beitrag: 03.12.08, 18:00
  4. genaues Thread.sleep()
    Von dontschew im Forum Java
    Antworten: 2
    Letzter Beitrag: 16.12.07, 12:51
  5. Thread/Applet wird nicht korrekt beendet
    Von joergdeymann im Forum Java
    Antworten: 2
    Letzter Beitrag: 30.05.04, 21:35