在使用glfwGetTime()在我的C项目中进行一些研究和调试之后,我无法为我的项目制作游戏循环.到目前为止,我真的只在
Java中使用纳秒,在GLFW网站上它声明该函数以秒为单位返回时间.如何使用glfwGetTime()进行固定时间步循环?
我现在拥有的 –
while(!glfwWindowShouldClose(window))
{
double now = glfwGetTime();
double delta = now - lastTime;
lastTime = now;
accumulator += delta;
while(accumulator >= OPTIMAL_TIME) // OPTIMAL_TIME = 1 / 60
{
//tick
accumulator -= OPTIMAL_TIME;
}
}
最佳答案 您只需要这个代码来限制更新,但保持渲染尽可能高的帧.该代码基于此
tutorial,非常好地解释了它.我所做的就是用GLFW和C实现相同的原则.
static double limitFPS = 1.0 / 60.0;
double lastTime = glfwGetTime(), timer = lastTime;
double deltaTime = 0, nowTime = 0;
int frames = 0 , updates = 0;
// - While window is alive
while (!window.closed()) {
// - Measure time
nowTime = glfwGetTime();
deltaTime += (nowTime - lastTime) / limitFPS;
lastTime = nowTime;
// - Only update at 60 frames / s
while (deltaTime >= 1.0){
update(); // - Update function
updates++;
deltaTime--;
}
// - Render at maximum possible frames
render(); // - Render function
frames++;
// - Reset after one second
if (glfwGetTime() - timer > 1.0) {
timer ++;
std::cout << "FPS: " << frames << " Updates:" << updates << std::endl;
updates = 0, frames = 0;
}
}
你应该有一个用于更新游戏逻辑的函数update()和一个用于渲染的render().希望这可以帮助.