2010-06-29 9 views
5

Ich erstelle eine Zeichenanwendung, die OpenGL wiedergibt, wenn ein WM_SCROLL oder WM_MOUSEMOVE abgerufen wird. Die Sache ist, dass es viele Mausbewegungen gibt und ich brauche es nur, um maximal 60 Bilder pro Sekunde zu rendern. Also habe ich einen Bool in meiner Engine-Klasse namens CanRender erstellt. also in meinem render() proc mache ich: if (! CanRender) { zurückgeben; } CanRender = false;Warum hört mein Timer auf zu ticken?

Grundsätzlich verhindert es das Rendern von mehr als 60 FPS.

Ich erstelle den Timer in WM_CREATE.

Wenn ich einen WM_TIMER bekomme, setze ich CanRender auf True.

Ich habe es piepsen lassen, also weiß ich, dass der Timer läuft. Sobald ich mit dem Scrollen oder Bewegen der Maus beginne, hört der Signalton auf und ich sehe kein Rendering mehr. Warum sollte es meinen Timer stoppen? Auch wenn ich den Timer minimiert, startet er neu und remaximize, es stoppt wieder.

Dank

Nachricht Pumpe:

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

} 

return (int) msg.wParam; 

Schöpfung:

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

Wie sieht Ihre gesamte Nachrichtenpumpe aus, und können Sie auch den Code eingeben, den Sie zum Erstellen des Timers verwenden? –

+0

Ja, ich vermute, dass es etwas Seltsames mit Ihrer Ereignisverarbeitung gibt. – stinky472

+0

Es ist nur, wenn meine Renderfunktion CanRender auf false setzt, sonst ist es in Ordnung – jmasterx

Antwort

3

Warum es so kompliziert machen?

Zeichnung in Windows-Anwendung wird in der Regel nur in WM_PAINT Nachricht und durch RedrawWindow-Funktion ausgelöst. Sie können RedrawWindow in WM_SCROLL und WM_MOUSEMOVE aufrufen. Mehrere Aufrufe von RedrawWindow (WM_PAINT-Nachrichten) werden minimiert, wenn Ihre Anwendung nicht mit der Zeichnung Schritt halten kann.

Auch wenn Sie OpenGL für die Synchronisation mit dem vertikalen Monitor Ihrer Monitore einstellen, werden Sie eine bestimmte Bildwiederholfrequenz nicht überschreiten.


Zu Ihrer Frage ... Ich denke, es sind viele WM_SCROLL und WM_MOUSEMOVE Nachrichten. Und diese können nicht zusammenbrechen. Also, wenn Sie Ihre Zeichnung in ihnen machen (was Zeit braucht), blockieren Sie Ihre Nachrichtenwarteschlange und WM_TIMER Nachrichten können nicht behandelt werden. Sie hören also keine Signaltöne.

Verwandte Themen