2012-07-14 126 views
0

我加入FPS計數器我的比賽之前,我嘗試添加它,它工作得很好,但現在它是一個白色的盒子,並在控制檯它以驚人的速度打印0 FPS:FPS計數故障

private void start() { 
    if (running) { 
     return; 
    } 
    running = true; 

    thread = new Thread(this); 
    thread.start(); 
    System.out.println("Error Free!"); 
} 

public void stop() { 
    if (!running) { 
     return; 
    } 
    running = false; 
    try { 
     thread.join(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.exit(0); 
    } 
} 

public void run() { 
    int frames = 0; 
    double UnproccesedSeconds = 0; 
    long PreviousTime = System.nanoTime(); 
    double SecondsPerTick = 1/60.0; 
    int TickCount = 0; 
    boolean Ticked = false; 

    while (running) { 
     long CurrentTime = System.nanoTime(); 
     long PassedTime = CurrentTime - PreviousTime; 
     PreviousTime = CurrentTime; 
     UnproccesedSeconds += PassedTime/1000000000.0; 

     while (UnproccesedSeconds < SecondsPerTick) { 
      tick(); 
      UnproccesedSeconds -= SecondsPerTick; 
      Ticked = true; 
      TickCount++; 
      if (TickCount % 60 == 0) { 
       System.out.println(frames + "fps"); 
       PreviousTime += 1000; 
       frames = 0; 
      } 
     } 

     if (Ticked) { 
      render(); 
      frames++; 
     } 
     render(); 
     frames++; 
    } 
} 

private void tick() { 
} 

private void render() { 
    BufferStrategy bs = this.getBufferStrategy(); 
    if (bs == null) { 
     createBufferStrategy(3); 
     return; 
    } 
    Screen.render(); 

    for (int i = 0; i < WIDTH * LENGTH; i++) { 
     PIXELS[i] = Screen.PIXELS[i]; 
    } 

} 

我查了一下,我找不到有什麼問題;如果有人能回到我身邊,那真是太棒了!

+1

在這裏,你應該避免單詞'asap'...我刪除它。 – home 2012-07-14 05:19:43

回答

1

線程的優先級可能會干擾您的遊戲輸出管道。也就是說,計數器消耗很多運行時間,引擎管線不能再跟上,這可能是爲什麼FPS報告爲0.

您可以嘗試降低線程的優先級(當您創建它)和/或將Thread.yield放置在你計算循環的某個位置。這是否意味着FPS計算將被分流到後面,但將允許(當時它至少快了)遊戲引擎運行正常

+0

所以你說fps計數器運行得更快,然後遊戲自己,並沒有給它足夠的時間來加載? – 2012-07-14 06:10:04

+1

不一定更快,但它可能會與渲染管線競爭,不足以讓渲染器通過及時處理它... – MadProgrammer 2012-07-14 06:34:50

+0

因此,如果我刪除它,它將工作。但爲了這個項目我最終不會添加它,那麼我將如何改變威脅優先級? – 2012-07-14 15:01:20

0

如果有人在這裏失去了就是錯了=)

此行

while (UnproccesedSeconds < SecondsPerTick) {} 

有待

while (UnproccesedSeconds > SecondsPerTick) {}