2010-06-29 21 views
5

Estoy creando una aplicación de dibujo que representa OpenGL cuando obtiene un WM_SCROLL o WM_MOUSEMOVE. El caso es que hay muchos movimientos de mouse y solo necesito que rinda un máximo de 60 fotogramas por segundo. Así que creé un bool en mi clase de motor llamada CanRender. así que en mi proceso de renderizado() hago: if (! CanRender) { return; } CanRender = false;¿Por qué mi cronómetro deja de funcionar?

Básicamente impide que rinda más de 60 FPS.

Creo el temporizador en WM_CREATE.

cuando obtengo un WM_TIMER establezco CanRender en verdadero.

Lo hice sonar, así que sé que el temporizador se está ejecutando. Tan pronto como comienzo a desplazar o mover el mouse, el pitido se detiene y ya no veo el renderizado. ¿Por qué iba a detener mi temporizador? Además, cuando minimizo el tiempo, el temporizador comienza de nuevo y se remaximiza, se detiene nuevamente.

Gracias

mensaje Bomba:

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

} 

return (int) msg.wParam; 

la creación:

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

¿Cómo se ve su bomba de mensajes, y también puede publicar el código que usa para crear el temporizador? –

+0

Sí, sospecho que hay algo extraño en el procesamiento de su evento. – stinky472

+0

Es solo cuando mi función de renderización establece CanRender en falso, de lo contrario está bien – jmasterx

Respuesta

3

¿Por lo que es tan complicado?

El dibujo en la aplicación de Windows normalmente se realiza solo en el mensaje WM_PAINT y se desencadena mediante la función RedrawWindow. Puede llamar a RedrawWindow dentro de WM_SCROLL y WM_MOUSEMOVE. Las llamadas múltiples a RedrawWindow (mensajes WM_PAINT) se colapsarán si su aplicación no puede seguir el ritmo del dibujo.

Además, si configura OpenGL para sincronizar con el retorno vertical de sus monitores, no superará cierta frecuencia de actualización.


cuanto a su pregunta ... Creo que hay muchos mensajes WM_SCROLL y WM_MOUSEMOVE. Y esos no se pueden colapsar. Entonces, si dibujas dentro de ellos (lo que lleva tiempo), bloqueas la cola de mensajes y no se pueden manejar los mensajes de WM_TIMER. Por lo tanto, no escuchas pitidos.

Cuestiones relacionadas