2010-06-29 131 views
5

我正在創建一個繪圖應用程序,它在獲取WM_SCROLL或WM_MOUSEMOVE時呈現OpenGL。事情是,有很多鼠標移動,我只需要它每秒最多60幀。所以我在我的引擎類CanRender中創建了一個bool。所以在我的render()proc我做: if(!CanRender) { return; } CanRender = false;爲什麼我的計時器停止滴答滴答?

基本上它可以防止它呈現超過60 FPS。

我在WM_CREATE中創建了計時器。

當我得到一個WM_TIMER我設置CanRender爲true。

我發出了蜂鳴聲,所以我知道計時器正在運行。 只要我開始滾動或移動鼠標,蜂鳴聲停止,我不再看到渲染。爲什麼會阻止我的計時器?另外,當我最小化定時器再次啓動然後重新調整,它再次停止。

感謝

消息泵:

// Main message loop: 
while (GetMessage(&msg, NULL, 0, 0)) 
{ 
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

} 

return (int) msg.wParam; 

創作:

case WM_CREATE: 
    //Set Window Title 
    SetWindowText(hWnd,engineGL.current.caption.c_str()); 

    SetTimer(hWnd,    // handle to main window 
     120,     // timer identifier 
     17,      // 60 fps interval 
     (TIMERPROC) NULL);  // no timer callback 
+2

你的整個消息泵是什麼樣的,你也可以發佈你用來創建定時器的代碼嗎? – 2010-06-29 01:05:24

+0

是的,我懷疑你的事件處理有些奇怪。 – stinky472 2010-06-29 01:06:14

+0

只有當我的渲染函數設置CanRender爲false時,否則它的罰款 – jmasterx 2010-06-29 01:08:16

回答

3

爲什麼使它這麼複雜?

在windows應用程序中繪圖通常只在WM_PAINT消息中完成,並由RedrawWindow函數觸發。你可以在WM_SCROLL和WM_MOUSEMOVE中調用RedrawWindow。如果您的應用程序無法跟上繪圖,多次調用RedrawWindow(WM_PAINT消息)將會崩潰。

此外,如果您設置OpenGL與您的顯示器垂直回掃同步您不會超過某些刷新率。


至於你的問題......我想有很多WM_SCROLL和WM_MOUSEMOVE消息。那些不能被摺疊。所以,如果你在他們的內部做繪圖(這需要時間),你會阻止你的消息隊列,WM_TIMER消息不能被處理。因此,你不會聽到嗶嗶聲。