我已经阅读了一些关于游戏循环的内容,但我似乎无法找出客观上最好的东西,尽管我觉得应该有最好的游戏循环这样的东西。
我将通过一些例子来回答我自己的问题。我正在寻找的游戏循环应该有最有效的方式来更新游戏状态和计算,同时倾听输入。当事情变得特定于语言时,假设我使用Java。
所以,最基本的游戏循环似乎是这样的:
while(running){
update();
render();
}
然而,这将使程序在不同的计算机上以不同的方式工作,这是不常需要的。所以为了解决这个问题,我通常会看到以下两种解决方案之一:
//Fix the timestep
double step = 1/60;
double time;
while(running){
update(step);
render();
try {
Thread.sleep(Math.max(0,step + (time - (time = System.currentTimeMillis()) / 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
或者
//Vary the timestep
double time;
while(running){
update(-time + (time = System.currentTimeMillis()) / 1000));
render();
}
我倾向于使用第二种选择,但后来我们遇到了一个问题:我们渲染的频率远远超过需要。所以我所做的就是保持这个循环,但只有timeSinceLastUpdate >= 1/60
才会呈现。
然而,最好的是我们宁愿让渲染和更新过程完全相互脱离,所以我考虑过多线程,我有一个线程可以获得每秒最佳的计算量(根据PC可以处理的数量,每秒计算的计算精确度等等),以及一个锁定到每秒一定帧数的线程,根据最后一个游戏状态显示游戏。但这会产生另一个问题:描述游戏状态的数据正在不断修改。因此,我保存最后一个游戏状态,构建另一个游戏状态,然后在完成后将其保存为已保存的游戏状态并再次构建另一个游戏状态,依此类推。但是,这意味着我不断创建新数据而不是更改现有数据,这可能会为计算机带来更多工作。
那么什么是最有效的游戏循环?我主要感兴趣的是计算一个全新的游戏状态而不是改变游戏状态会产生很大的影响