2013-07-18 176 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()只会执行逻辑更新,而且它不是一个真正的渲染操作!来自巴西的欢呼声! –