在Win32 OpenGL中更新场景的正确方法是什么

时间:2012-02-13 18:36:41

标签: winapi opengl

现在我有两个计时器。一个用于物理,一个用于显示。

显示计时器附加到主窗口。大约每5毫秒一次并发布消息WM_PAINT,WM_PAINT消息处理程序说运行opengl显示代码,然后执行SwapBuffers()。

物理计时器附加到辅助窗口(除此之外,我知道如何实现Windows计时器的唯一方法是将它附加到窗口)。处理程序使它更新我的物理代码。

然而,我注意到有时显示器是“spazzy”。它几乎没有引人注意,也许每秒只有一个小的spaz,但我怀疑有一些事情会使物理学在短时间内移动得更慢或更快。

1 个答案:

答案 0 :(得分:3)

交互式模拟的正确方法(如你的)是将绘图函数称为空闲动作:

... idle_action(...)
{
    redraw();
}

... event_loop(...)
{
    while(!quit) {
       event e = PeekEvent();
       if( e != NO_EVENT ) {
           process_event();
       } else {
           idle_action();
       }
    }
}

您应该测量绘制框架所需的时间,而不是使用计时器。

同样为了物理模拟的精确性,您也不应该使用计时器。相反,您应该在恒定长度的较小时间步长中前进,以便在单个渲染帧中有多个时间步长。因此,例如对于60Hz刷新率,帧间隔约为16ms。 如果以1ms的步长执行物理模拟,则计算中间的16个步骤。 * 请注意,大多数(如果不是全部)物理模拟包都在内部执行此操作。即您正在设置步长间隔,然后只需要按照您希望的时间进行物理模拟。

在实践中,这意味着,当您测量框架绘图时,您将推进物理模拟。