2012-02-13 101 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

相關問題