2014-11-03 73 views
0

我是java的初學者。我正在努力學習遊戲開發。我在看YouTube上的this偉大程序員的教程!我正在跟蹤他,並且達到了這個播放列表的「#9 - 基本碰撞界限」。需要關於Java遊戲循環的說明

他創建了以下游戲循環......

public void run(){ 
     init(); 
     long lastTime = System.nanoTime(); 
     final double amountOfTicks = 60.0; 
     double ns = 1000000000/amountOfTicks; 
     double delta = 0; 
     int updates = 0; 
     int frames = 0; 
     long timer = System.currentTimeMillis(); 

     while(running){ 
      long now = System.nanoTime(); 
      delta += (now - lastTime)/ns; 
      lastTime = now; 
      if(delta >= 1){ 
       tick(); 
       updates++; 
       delta--; 
      } 
      render(); 
      frames++; 

      if(System.currentTimeMillis() - timer > 1000){ 
       timer += 1000; 
       System.out.println(updates + " Ticks, Fps " + frames); 
       updates = 0; 
       frames = 0; 
      } 

     } 
     stop(); 
    } 

我對這個方法非常困惑。這種方法如何運作?以下變量如何工作?

amountOfTicks

三角洲

更新

框架

我明白這裏解釋這不是很可行的,但請大家幫幫我。你也可以給我任何參考來學習和理解這一點。如果您需要更多信息,我會馬上提供!

+0

我認爲他們是計算所以他可以控制發生在每秒60幀 – JRowan 2014-11-03 00:37:37

回答

2

已經解釋了變量,但如果您仍然無法理解遊戲循環在一般意義上的作用(我不知道他在教程中解釋了多少),希望我可以從我已經瞭解到:

基本上,遊戲循環當然會運行(渲染,更新等)遊戲,但它也會設置恆定的,受控的遊戲運行速度。例如,想象一下你想製作一款2D RPG遊戲,並且你希望暴徒(角色)以每秒200像素的速度在屏幕上移動。你可以用一個循環來做到這一點,但事實是,不同的計算機會導致角色在不同的時間更快或更慢地移動,因爲計算機會一次又一次地執行循環中的代碼。

這就是爲什麼您要實現代碼來控制代碼執行速度以及遊戲更新速度的原因。你可以通過使用現實世界的時間來做到這一點(使用獲得納秒時間的方法)。你限制遊戲只更新每秒60次的幀。

在while(running)循環中使用if語句時,只有當程序經過循環時,以及自上次執行if語句至少1/60秒以來的時間才進行遊戲更新。

希望這是有道理的。對不起,很長的迴應。如果你有更多的問題隨時問!

1

amountOfTicks基本上定義了您想要在一秒鐘內有多少滴答滴!所以值爲60時,方法tick()將被稱爲約。每秒60次。在tick()方法中,通常你的遊戲邏輯應該發生!

delta描述System.nanoTime(從現在開始)和最後一個tick()之間的時間差(以納秒爲單位)。當該值超過1時,調用tick並且delta減少1。

第二個if語句會在第二秒中顯示屏幕的渲染頻率以及發生了多少次更新。更新會隨着每個tick()增加,所以這應該在60左右。根據框架和底層硬件,幀計數器會更高。

我覺得奇怪的是,render()可能會被經常調用。這可能是一個非常昂貴的調用,但這取決於給定的框架和硬件。