现在我有两个计时器。一个用于物理,一个用于显示。
显示计时器附加到主窗口。它大约每 5 毫秒发送一次消息 WM_PAINT,WM_PAINT 消息处理程序表示运行 opengl 显示代码,然后执行 SwapBuffers()。
物理计时器附加到辅助窗口(没有其他原因,我知道如何实现 Windows 计时器的唯一方法是将其附加到窗口)。处理程序使它更新我的物理代码。
但是,我注意到有时显示是“spazzy”。它几乎不引人注意,也许每秒一个微小的 spaz,但我怀疑发生了什么事情使物理运动在短时间内变慢或变快。
最佳答案
交互式模拟(像你的)的正确方法是调用绘图函数作为空闲操作:
... idle_action(...)
{
redraw();
}
... event_loop(...)
{
while(!quit) {
event e = PeekEvent();
if( e != NO_EVENT ) {
process_event();
} else {
idle_action();
}
}
}
您应该测量绘制帧所花费的时间,而不是使用计时器。
另外,为了物理模拟的精确性,您也不应该为此使用计时器。相反,您应该以恒定长度的较小时间步长推进它,以便单个渲染帧有多个时间步长。因此,例如,对于 60Hz 的刷新率,您的帧间隔约为 16ms。 如果您以 1 毫秒的步长执行物理模拟,您将计算其间的 16 个步长。 *请注意,大多数(如果不是全部)物理模拟包都在内部执行此操作。 IE。您正在设置步长间隔,然后仅在您希望进行的所需时间调用物理模拟。
在实践中,这意味着您将在测量要拍摄的框架图时推进您的物理模拟。
关于winapi - 在 Win32 OpenGL 中更新场景的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9265955/