在使用任何编程语言(可以)创建游戏时,重要的是有一个固定的目标帧速率,游戏将重绘屏幕,但是有些语言要么没有同步功能,要么计时器不可靠,所以有什么方法吗仅通过数学和/或通过休眠线程手动保持帧速率稳定?也许使用帧增量?
到目前为止,我只尝试过'sleep(targetframerate - (targetframerate-delta))' 这应该是意识到前一帧比目标花费的时间更长,所以然后通过更快地制作下一帧来进行补偿,但是它会影响自己并简单地杀死帧速率呈指数反向。
这些内置同步功能必须在这样的方法中使用某种数学来稳定帧速率。在 OpenGL 等高端 API 中是如何实现的?
问问题
2665 次
1 回答
2
创建一个运行非常快的计时器,例如每毫秒(稍后解释原因)并声明这三个变量:
private int targetMillis = 1000/60,
lastTime = (int)System.currentTimeMillis(),
targetTime = lastTime+targetMillis;
targetMilis 是每帧之间所需的毫秒数。将 60 更改为所需的帧速率。
lastTime 只是最后一帧的时间,比较它的时间。设置为现在。
targetTime 是下一帧的到期时间。现在 + targetMillis。
还可以添加一个可选的 timerScaler 来缩放任何运动,这样它们就不会因为帧速率而减慢:
public static float timeScaler = 1;
然后在计时器的每个滴答声上,运行此代码,以检查是否是下一帧的时间并设置下一个 - 考虑到帧是否迟到并适当地更快地制作下一个。
int current = (int)System.currentTimeMillis(); // Now time
if (current < targetTime) return; // Stop here if its not time for the next frame
timeScaler = (float)targetMillis/(current-lastTime);
//Scale game on how late frame is.
lastTime = current;
targetTime = (current+targetMillis)-(current-targetTime);
// Create next frame where it should be (in targetMillis) and subtract if frame was late.
[Game code here.]
有人会假设如果我们每个 targetMillis 都需要一个帧,我们可以只为那个时间创建一个计时器,但是正如你所说,它们可能会延迟几毫秒,因此如果我们仍然使用这种方法并且确实将 targetTime 偏移了一些,它不会重要的是它总是会过冲,因此计时器的速度更多的是精度分辨率。
于 2013-08-06T00:35:28.010 回答