2012-02-13 129 views
3

现在我有两个计时器。一个用于物理和一个用于显示。什么是在Win32中更新场景的正确方法OpenGL

显示计时器连接到主窗口。它大约每5ms发送一次消息WM_PAINT,并且WM_PAINT消息处理程序说要运行opengl显示代码,然后执行SwapBuffers()。

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

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

回答

3

交互式仿真正确的方法(如您的)是调用绘图功能为闲置操作:

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

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

而是使用定时器,你应该测量才能得出一个帧的时间的。

同样为了物理模拟的精确性,您不应该使用定时器。相反,您应该以更小的恒定长度的时间步进,以便在单个渲染帧中执行多个时间步。因此,例如,对于60Hz的刷新率,帧间隔为16ms。 如果你以1ms的步幅进行物理模拟,你需要计算16个步骤。 * 请注意,如果不是所有的物理模拟软件包,大部分都是在内部完成的。即你正在设置步长间隔,然后只用你喜欢它进行的期望时间调用物理模拟。

实际上,这意味着,当你测量框架图的时候,你会推进你的物理模拟。

+0

但窗户循环是这样的: 而(的GetMessage(味精,NULL,0,0)> 0) { 的TranslateMessage(&msg); DispatchMessage函数(&msg); } – pete 2012-02-14 02:00:46

+0

NVM,我发现 “的PeekMessage”,但我仍然不知道如何检查它对“空事件”。 – pete 2012-02-14 02:07:03

+0

nvm,我发现使用它的返回值来检查 – pete 2012-02-14 02:14:41

相关问题