2010-02-08 14 views
6

Ich bin auf der Suche nach einer portablen Möglichkeit, einen nicht blockierenden SwapBuffers() zu machen, auch wenn VSync aktiviert ist.
Mit anderen Worten, ist es möglich, durch ein Ereignis benachrichtigt zu werden oder die Verzögerung bis zum nächsten VSync zu kennen?nicht-blockierende SwapBuffers() mit VSync = on

+0

Dies wird plattformspezifisch sein, wenn es überhaupt möglich ist. Bitte geben Sie Ihre Plattform an, indem Sie mindestens ein Tag markieren. – unwind

+0

Ich möchte eine portable Möglichkeit finden, diese Funktion zu implementieren (Win32/Linux/MacOSX) –

+0

Wie hilft Ihnen die Verzögerung bis zum nächsten vsync? Es ist nicht so, dass der Swap-Puffer-Aufruf den Swap zum Zeitpunkt des Anrufs ausführt. – Bahbar

Antwort

0

Erstens, warum rufen Sie nicht SwapBuffers() am Anfang des Frames? Oder irgendwie die Pipeline ändern

Render(); 
    Update(); //Update before swapping buffers 
    SwapBuffers(); 

Während OpenGL ist bei allen Befehlen arbeiten weg einfach es warf, können Sie alle Ihre Update-Logik zu tun.

Ansonsten gibt es ein paar Möglichkeiten, um dieses Problem zu lösen.

Ich weiß, dass XNA eine ScanLine-Eigenschaft hat, die Ihnen sagt, welche Scanline der Bildschirm gerade macht. Ich weiß nicht, ob OpenGL dies auch entlarvt, aber ich bin mir ziemlich sicher, dass es das tun muss. (Richtig?)

Verwenden Sie Multithread-Rendering. Viele moderne Engines widmen nur zum Rendern einen ganzen Thread. Wenn es blockiert, ist es in Ordnung, es stört den Hauptthread nicht. Alternativ dazu ist es einfacher, Eingaben usw. in einem neuen Thread zu verarbeiten, um Komplikationen mit Grafikkontexten zu vermeiden.

Verwenden Sie triple buffering. Dreifache Pufferung bedeutet, dass Sie zwei Rückpuffer haben. Nachdem Sie SwapBuffers aufgerufen haben, kann der Bildschirm weiterhin den Frontpuffer durchsuchen, wobei der neu abgeschlossene Puffer und der dritte Puffer für das Rendern des nächsten Rahmens warten. Wenn Sie bereits zwei Frames bereits vorgerendert haben, wird SwapBuffers() blockiert.