我一直在阅读游戏循环,并且很难理解插值的概念。从我到目前为止看到的情况来看,高级游戏循环设计应该类似于下面的示例。
我们希望我们的循环能够获得50个奖金
while(true){
beginTime = System.currentTimeMillis();
update();
render();
cycleTime = System.currentTimeMillis() - beginTime;
//if processing is quicker than we need, let the thread take a nap
if(cycleTime < 50)
Thread.sleep(cycleTime);
)
//if processing time is taking too long, update until we are caught up
if(cycleTime > 50){
update();
//handle max update loops here...
}
}
让我们假设update()和render()都只需要1个滴答就可以完成,让我们有49个滴答来休眠。虽然这对我们的目标滴答率很有帮助,但它仍会导致“抽搐”。动画由于睡眠时间太长。为了调整这个而不是睡觉,我会假设某种渲染应该在第一个if条件下进行。我发现的大多数代码示例只是将插值传递给渲染方法,就像这样...
while(true){
beginTime = System.currentTimeMillis();
update();
render(interpolationValue);
cycleTime = System.currentTimeMillis() - beginTime;
//if processing is quicker than we need, let the thread take a nap
if(cycleTime < 50)
Thread.sleep(cycleTime);
)
//if processing time is taking too long, update until we are caught up
if(cycleTime > 50){
update();
//handle max update loops here...
}
interpolationValue = calculateSomeRenderValue();
}
由于49个嘀嗒睡眠时间,我不知道这是如何工作的?如果有人知道我可以查看的文章或样本,请告诉我,因为我不确定插值的最佳方法是什么......
答案 0 :(得分:0)
我知道它有点晚了,但希望这篇文章会有所帮助 http://gameprogrammingpatterns.com/game-loop.html
它很好地解释了游戏时间安排。我认为你有点困惑的主要原因是因为将渲染函数传递给当前经过的时间。当然这取决于你使用的系统,但是传统上渲染不会以任何方式修改场景,它只绘制它,因此它不需要知道已经过了多少时间。
然而,更新调用会修改场景中的对象,并且为了及时保持它们(例如播放动画,Lerps等...),更新功能需要知道全局或已经过了多少时间最后一次更新。
无论如何,没有必要让我公平地参与其中......那篇文章非常有用。
希望这有帮助