关于gameloop

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

第一:最简单的

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

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


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

<span style="font-family: Arial, Helvetica, sans-serif;">double lastTime = getCurrentTime();</span><pre name="code" class="cpp">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的剩余了。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值