2016-06-07 19 views
1

, wie das Problem in der Log-Katze zu lösen .. sagt die Fehlerwartezeit ist negativ und stürzt auf imulator und externes GerätJava Multithreading in android

dies mein Code Android in Java-Aktivität ist

public void run() { 
     long startTime; 
     long timeMills; 
     long waitTime; 
     long totalTime = 0; 
     int frameCount = 0; 
     long targetTime = 1000/FPS; 

     while (running){ 
      startTime = System.nanoTime(); 
      canvas = null; 
      try { 
       canvas = this.surfaceHolder.lockCanvas(); 
       synchronized (surfaceHolder){ 
        this.gamePanel.update(); 
        this.gamePanel.draw(canvas); 
       } 
      }catch (Exception e){ 
       e.printStackTrace(); 
      }finally { 
       if(canvas != null){ 
        try { 
         surfaceHolder.unlockCanvasAndPost(canvas); 
        }catch (Exception e){ 
         e.printStackTrace(); 
        } 
       } 
      } 
      timeMills = (System.nanoTime() - startTime)/1000000; 
      waitTime = targetTime - timeMills; 
      try { 
       this.sleep(waitTime); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      totalTime += System.nanoTime() - startTime; 
      frameCount++; 
      if(frameCount == FPS){ 
       avrageFPS = 1000/(totalTime/frameCount)/1000; 
       frameCount = 0; 
       totalTime = 0; 
       System.out.print(avrageFPS); 
      } 
     } 
    } 

und das ist das Protokoll

java.lang.IllegalArgumentException: millis < 0: -136 
+0

Was ist targetTime? Es sieht so aus, als ob es in diesem.sleep (waitTime) abstürzt, so dass Ihre waitTime = targetTime - timeMillis einen negativen Wert zurückgibt. Sie können nicht eine negative Zeit warten. –

+0

Tareget Zeit ist die Zielmenge von FPS Ich brauche das Spiel mit –

+0

zu laufen, so dass ich den Faden schlafen die verbleibende Zeit zwischen der Thread-Endung und dem Ziel, so dass sie die benötigten FPS erreichen –

Antwort

0

Ihr Code tut dies:

long targetTime = 1000/FPS; 

while (...) { 
    startTime = System.nanoTime(); 
    ... do lots of work ... 
    timeMills = (System.nanoTime() - startTime)/1000000; 
    waitTime = targetTime - timeMills; 

Wenn die zum Vorbereiten und Rendern eines Frames erforderliche Zeit targetTime überschreitet, wird waitTime negativ. Die Komplexität Ihrer Animation und der Wert für FPS beeinflussen, wie wahrscheinlich dies ist.

Die einfachste Lösung ist einfach:

if (waitTime < 0) { waitTime = 0; } 

diese Weise, wenn Ihr Rendering zu lange dauert und Sie verpassen Fristen, die Sie nicht mehr schlafen.

Eine bessere Lösung bestünde darin, das Spiel so zu strukturieren, dass es vom Timing des Displays abweicht, anstatt eine feste Vorstellung von der Bildrate zu haben und Frames fallen zu lassen, wenn man zurückfällt. Weitere Informationen hierzu finden Sie unter this appendix in der Grafikarchitektur doc.

+0

Ich werde es jetzt versuchen ok –

+0

Ich gehe kein Fehler und keine Abstürze ich dachte nicht zu prüfen, ob es 0 ist und ob es ist nicht .. danke –

+0

aber es gibt ein Problem, das Protokoll die fps als 0,0 ausgeben .. warum? –

Verwandte Themen