2010-06-29 8 views
5

Sto creando un'applicazione di disegno che esegue il rendering di OpenGL quando ottiene un WM_SCROLL o WM_MOUSEMOVE. Il fatto è che ci sono molti movimenti del mouse e ho solo bisogno di renderizzare un massimo di 60 fotogrammi al secondo. Così ho creato un bool nella mia classe di motori chiamata CanRender. così nel mio render() proc I do: if (! CanRender) { return; } CanRender = falso;Perché il mio timer smette di spuntare?

Fondamentalmente impedisce di eseguire il rendering di oltre 60 FPS.

Creo il timer in WM_CREATE.

quando ottengo un WM_TIMER, ho impostato CanRender su true.

Ho fatto un segnale acustico in modo da sapere che il timer è in esecuzione. Non appena inizio lo scrollo o lo spostamento del mouse, il segnale acustico si interrompe e non vedo più rendering. Perché dovrebbe fermare il mio timer? Anche quando minimizzo il timer ricomincia, quindi rimpicciolisce, si ferma di nuovo.

Grazie

Messaggio Pompa:

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

} 

return (int) msg.wParam; 

creazione:

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

Che aspetto ha l'intera pompa del messaggio e puoi anche inserire il codice che utilizzi per creare il timer? –

+0

Sì, ho il sospetto che ci sia qualcosa di strano nell'elaborazione degli eventi. – stinky472

+0

È solo quando la mia funzione di rendering imposta CanRender su false, altrimenti va bene – jmasterx

risposta

3

Perché rendendo così complicato?

Il disegno nell'applicazione Windows viene solitamente eseguito solo nel messaggio WM_PAINT e attivato dalla funzione RedrawWindow. Puoi chiamare RedrawWindow all'interno di WM_SCROLL e WM_MOUSEMOVE. Più chiamate a RedrawWindow (messaggi WM_PAINT) verranno compresse se l'applicazione non può tenere il passo con il disegno.

Inoltre, se si imposta OpenGL per la sincronizzazione con il ritracciamento verticale dei monitor, non si supererà la frequenza di aggiornamento.


Per quanto riguarda la tua domanda ... Immagino ci siano molti messaggi WM_SCROLL e WM_MOUSEMOVE. E quelli non possono essere crollati. Quindi se fai il disegno dentro di loro (che richiede tempo), blocchi la coda dei messaggi e non è possibile gestire i messaggi WM_TIMER. Pertanto, non si sentono segnali acustici.

Problemi correlati