2010-06-29 4 views
5

나는 WM_SCROLL 또는 WM_MOUSEMOVE를 얻을 때 OpenGL을 렌더링하는 그리기 응용 프로그램을 만들고 있습니다. 문제는 마우스 움직임이 많고 초당 최대 60 프레임 만 렌더링하면됩니다. 그래서 CanRender라는 엔진 클래스에 bool을 만들었습니다. 그래서 내 렌더링에서() proc : if (! CanRender) { return; } CanRender = false;타이머가 멈추는 이유는 무엇입니까?

기본적으로 60FPS 이상을 렌더링하지 못합니다.

저는 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

전체 메시지 펌프가 어떻게 보이며 타이머를 만드는 데 사용하는 코드를 게시 할 수 있습니까? –

+0

예, 귀하의 이벤트 처리에 이상한 점이 있다고 생각됩니다. – stinky472

+0

내 렌더링 함수가 CanRender를 false로 설정 한 경우에만 해당합니다. 그렇지 않은 경우에는 – jmasterx

답변

3

너무 복잡하게 만드는 이유는 무엇입니까?

일반적으로 Windows 응용 프로그램에서 그리기는 WM_PAINT 메시지에서만 수행되고 RedrawWindow 기능에 의해 트리거됩니다. WM_SCROLL 및 WM_MOUSEMOVE 내에서 RedrawWindow를 호출 할 수 있습니다. 응용 프로그램이 그리기를 따라갈 수없는 경우 RedrawWindow (WM_PAINT 메시지)에 대한 다중 호출이 축소됩니다.

또한 모니터의 수직 리 트레이스와 동기화되도록 OpenGL을 설정하면 특정 재생 빈도를 초과하지 않습니다. 귀하의 질문에 관해서는


은 ... 나는 많은 WM_SCROLL 및 WM_MOUSEMOVE 메시지가 것 같아요. 그리고 그것들은 붕괴 될 수 없습니다. 따라서 드로잉을 할 때 (시간이 걸립니다) 메시지 대기열을 차단하면 WM_TIMER 메시지를 처리 ​​할 수 ​​없습니다. 따라서 삐 소리가 들리지 않습니다.

관련 문제