2013-07-18 174 views
0

我很難理解控制遊戲循環的一段代碼......我無法理解此while循環的用途「while(unprocessedSeconds> secondsForEachTick)」,爲什麼FPS計數器如果裏面如果(tickCounter%60 == 0)喜歡如下上的代碼:遊戲循環控制

public void run() 
{ 
    int frames = 0; 
    double unprocessedSeconds = 0; 
    long previousTime = System.nanoTime(); 

    double secondsForEachTick = 1/60.0; 


    int tickCount = 0; //RENDER COUNTER 
    boolean ticked = false; 

    while (running) 
    { 
     long currentTime = System.nanoTime(); 
     long passedTime = currentTime - previousTime; 

     previousTime = currentTime; 

     unprocessedSeconds = unprocessedSeconds + passedTime/1000000000.0; 

     int count = 0; 
     while(unprocessedSeconds > secondsForEachTick) 
     { 
      tick(); 
      count++; 
      unprocessedSeconds -= secondsForEachTick; 

      ticked = true; 
      tickCount++; 

      if(tickCount % 60 == 0){ 
       System.out.println(frames + " fps"); 
       previousTime += 1000; 
       frames = 0; 
      } 
     } 
     System.out.println("Iterações do loop: "+count); 

     if(ticked) 
     { 
      render(); 
      frames++; 
      ticked = false; 
     } 

    } 
} 
+0

'tickCount%60'由於名稱和60,沒有進入代碼,它聞起來像分鐘/秒的計算..(1分鐘= 60秒) - 調試它,你會更好地理解它。 – Maroun

回答

4

即內循環的同時確保了遊戲的更新是基於固定的時間,而不是幀的時間。未處理的時間正在收集,一旦它大於一個時間段的時間範圍,它將調用tick()

TickCount基本上是計數滴答(滴答時間是1/60秒,所以60滴答/秒),並且一旦它過了1秒,它打印收集的幀(所以FPS)。另外,ticked表示遊戲中可能會更改某些內容,因此需要新的渲染。

+0

男人,非常感謝你!我試圖理解這是大約3天的邏輯,現在我可以看到它!做得好!來自巴西的歡呼聲! –

0

此循環用於在遊戲中保持一定的時間。所以如果由於某種原因你會得到滯後,你會做幾個邏輯更新和一個渲染。我假設tick()執行一些邏輯操作。

更確切地說,例如,你有子彈,並且需要在0.1s處更新子彈位置以進行適當的碰撞測試。如果由於某些原因,三角洲時間增長到0.4秒,你的子彈將穿過牆壁飛行。爲了處理它,你用更小的時間步進行幾次迭代,這個循環就是這樣做的。

+0

感謝您幫助好友,因爲我是新的遊戲開發人員,我看不到那個tick()只會執行邏輯更新,而且它不是一個真正的渲染操作!來自巴西的歡呼聲! –