为了好玩,我最近开始开发自己的游戏引擎。我实现了一种从文件中加载Blender.OBJ模型的方法,并成功地渲染了它们。然而,在进行压力测试时,我的基于德尔塔时间的fps系统遇到了一个不同寻常的困境。在1500FPS的速度下运行时,我需要4秒才能从模型墙的一端看到另一端。然而,如果我将FPS限制在120FPS,从墙的一端到另一端只需要0.84秒。随着我的进一步探索,事实上,游戏移动速度似乎随着FPS的增加而降低。
这是我的Timer类:
class Timer
{
long lastFrame;
int fps;
long lastFPS;
int delta;
int fpsToReturn;
public Timer()
{
lastFPS = getTime();
}
public long getTime()
{
return (Sys.getTime() * 1000) / Sys.getTimerResolution();
}
public int getDelta()
{
long time = getTime();
delta = (int) (time - lastFrame);
lastFrame = time;
return delta;
}
public void updateFPS()
{
if (getTime() - lastFPS > 1000)
{
fpsToReturn = fps;
fps = 0;
lastFPS += 1000;
}
fps++;
}
public int getFPS()
{
return fpsToReturn;
}
}
当然,移动只是沿着的路线
camera.rotX += (0.5 * timer.getDelta());
有人有什么想法吗?德尔塔时间应该是这样工作的吗?当以16FPS运行时,它会返回65左右,在120FPS时,德尔塔会返回8-9左右,而无上限的FPS总是返回0或1,如果这有影响或有助于您发现无上限的FPS是否有问题的话。我真的很感谢你们的帮助,谢谢你们。
解决了我自己的问题,很高兴我在这个过程中学会了。
我后来在实现角度移动时发现了我的问题,那就是每次我需要它时,我都会使用getDelta()和getFPS()方法,每帧不止一次,这就抛出了delta变量。我通过使用一个静态变量(一个用于FPS,一个用于Delta)并在每帧结束时更新每个变量来解决这个问题。
伪代码:
public static double globalDelta;
while(nextFrame) //Loops once per frame
{
updateGame();
globalDelta = calculateDelta();
}