我应该如何确定我的更新长度(增量)应该在我的 Java 游戏循环中?
How should I figure out what my update length (delta) should be in my Game loop in Java?
考虑这个游戏循环:
double nextTime = (double)System.nanoTime() / 1000000000.0;
while(runFlag)
{
double currTime = (double)System.nanoTime() / 1000000000.0;
if(currTime >= nextTime)
{
nextTime += delta;
update();
draw();
}
else
{
int sleepTime = (int)(1000.0 * (nextTime - currTime));
if(sleepTime > 0)
{
try
{
Thread.sleep(sleepTime);
}
catch(InterruptedException e)
{
}
我应该如何计算一个合适的增量值(下一次更新和渲染之前必须经过的时间)。我已经看到它是用不同的方式计算的,但我仍然不确定到底是怎么回事或到底是怎么回事。这是一个固定的时间步长循环,例如,如果我想计算 60 帧中 30 帧的 恒定 fps 的增量,我必须将其设置为 和 为什么?我无法理解我在互联网上遇到的一些解释。谢谢
如果您想要每秒产生特定的帧率,请考虑以下因素:
- 您想每 1/frames-per-second 秒生成一个新帧。
- 生成帧(处理中)可能需要
p
秒
- 帧制作之间的 "free time",
delta
,将是 1/frames-per-second - p
您可以使用以下伪代码:
frameTimeMilliseconds = 1000 / frames-per-second
Loop(condition) {
startFrameTime = system current time in milliseonds
do frame production
endFrameTime = system current time in milliseconds
sleepTime = frameTimeMilliseconds - (endFrameTime - startFrameTime)
sleep for sleepTime milliseconds
}
您可能希望处理实际帧生成时间长于所需帧生成时间的情况(即 sleepTime is <= 0
)
考虑这个游戏循环:
double nextTime = (double)System.nanoTime() / 1000000000.0;
while(runFlag)
{
double currTime = (double)System.nanoTime() / 1000000000.0;
if(currTime >= nextTime)
{
nextTime += delta;
update();
draw();
}
else
{
int sleepTime = (int)(1000.0 * (nextTime - currTime));
if(sleepTime > 0)
{
try
{
Thread.sleep(sleepTime);
}
catch(InterruptedException e)
{
}
我应该如何计算一个合适的增量值(下一次更新和渲染之前必须经过的时间)。我已经看到它是用不同的方式计算的,但我仍然不确定到底是怎么回事或到底是怎么回事。这是一个固定的时间步长循环,例如,如果我想计算 60 帧中 30 帧的 恒定 fps 的增量,我必须将其设置为 和 为什么?我无法理解我在互联网上遇到的一些解释。谢谢
如果您想要每秒产生特定的帧率,请考虑以下因素:
- 您想每 1/frames-per-second 秒生成一个新帧。
- 生成帧(处理中)可能需要
p
秒 - 帧制作之间的 "free time",
delta
,将是1/frames-per-second - p
您可以使用以下伪代码:
frameTimeMilliseconds = 1000 / frames-per-second
Loop(condition) {
startFrameTime = system current time in milliseonds
do frame production
endFrameTime = system current time in milliseconds
sleepTime = frameTimeMilliseconds - (endFrameTime - startFrameTime)
sleep for sleepTime milliseconds
}
您可能希望处理实际帧生成时间长于所需帧生成时间的情况(即 sleepTime is <= 0
)