关于gameloop

    gameloop顾名思义就是游戏的主循环了。不过因为机器的不同,为了带来更好的gameplay,需要对GameLoop进行一个深入的探究。

第一:最简单的

while( true ) {
        update();
        render();
    }

什么都不需要管,简单了事。但是问题多多。如果还恒定的机器上还好,恒定以一个速率来刷新。但是如果在卡的机器下面,你就gg了。你会发现你什么都不能控制。发出去的子弹可以时快时慢。


第二:可以感知时间的流逝。

double lastTime = getCurrentTime();
while (true)
{
  double current = getCurrentTime();
  double elapsed = current - lastTime;
  processInput();
  update(elapsed);
  render();
  lastTime = current;
}

 这样的话我们就可以根据经过的时间进行对应的刷新。但是这个还是会有致命伤,无论在快还是慢的机器上!在慢的机器上,本来就会感受到卡顿。然后在快的机器上,因为float,double的关系,会将误会越拉越大。


第三:以恒定的速度刷新

double previous = getCurrentTime();
double lag = 0.0;
while (true)
{
  double current = getCurrentTime();
  double elapsed = current - previous;
  previous = current;
  lag += elapsed;

  processInput();

  while (lag >= MS_PER_UPDATE)
  {
    update();
    lag -= MS_PER_UPDATE;
  }

  render();
}

这样的话,无论在慢的机器上或者在快的机器上,update函数调用的次数跟MS_PER_UPDATE这个参数相关。MS_PER_UPDATE一般是大于60FPS,而且还要大于update函数所需要的时间。不然的话,内部那个循环可能跳不出去。还有一个注意的的是,render可以在两次update之间出现,因为lag有剩余。update() | render() | update()。会出现怎么样一种情况呢,就是一个子弹第一次update在屏幕左侧,render的时候理论上子弹应该在中央的问题,下一次update便在屏幕右侧,因为render也是需要时间的,但是由于上述问题,render期间并没有计算子弹飞行的距离,所以造成这样的现象。那么解决方法就是传入一个时间差,render(lag/MS_PRE_UPDATE),这样的render的时候就可以补上lag的剩余了。


你可能感兴趣的:(game,game)