2013-08-13 8 views
7

OpenGL-Funktionen sind so definiert, als würden sie synchron arbeiten. Aber Rendering-Funktionen (und andere) werden oft von der GPU asynchron ausgeführt. OpenGL wird dies effektiv verbergen: Wenn Sie etwas tun, das die Ergebnisse einer Operation erfordert (wie das Lesen von einem Framebuffer, der gerendert wurde), stoppt OpenGL CPU-Operationen, bis die GPU diesen Punkt erreicht hat.Gibt es eine Möglichkeit zu sagen, ob eine OpenGL-Operation abgeschlossen ist?

Das ist funktional, aber kaum ideal für die Leistung, da die CPU im Grunde blockiert, bis die GPU fertig ist. Gibt es eine Möglichkeit, festzustellen, ob eine bestimmte Operation abgeschlossen wurde, damit Sie wissen, dass eine abhängige Operation ausgeführt wird, ohne dass so viele CPUs blockiert werden?

Antwort

6

Ja, gibt es. Angenommen, Sie haben Zugriff auf OpenGL 3.2+ oder die Erweiterung ARB_sync.

Wenn Sie wissen möchten, wann ein bestimmter Befehl beendet wurde, können Sie sofort nach dem Ausgeben dieses Befehls einen "Zaun" sync object in den Befehlsstrom einfügen. Dies geschieht mit der glFenceSync function.

Sie müssen den von dieser Funktion zurückgegebenen Zeiger speichern. Mit diesem Zeiger können Sie abfragen, ob der Zaun abgeschlossen ist, indem Sie prüfen, ob der Zaun mit der glGetSync function signalisiert wird. Wie folgt aus:

GLint isSignaled = 0; 
glGetSync(syncObj, GL_SYNC_STATUS, 1, NULL, &isSignaled); 

if(isSignaled == GL_SIGNALED) 
{ 
    //Prior commands have completed. 
} 
else 
{ 
    //Not done yet. 
} 

Wenn Sie aus anderen Sachen laufen zu tun, brauchen Sie nicht für das Sync-Objekt zu warten, zu beenden; Sie können einfach den gewünschten OpenGL-Prozess ausführen. Dadurch wird der CPU-Block für Sie ausgelöst.

Sobald Sie mit dem Synchronisierungsobjekt fertig sind, müssen Sie es löschen . Verwenden Sie dazu die glDeleteSync function.

+0

Große Frage. Aber ist es in Ordnung sowohl Fragen und Antworten zur gleichen Zeit? ;) Kann eine solche Synchronisierungsprüfung auch keinen unnötigen Overhead für die Pipeline hinzufügen? –

+1

@MichaelIV: "Aber ist es in Ordnung, gleichzeitig zu fragen und zu antworten?" "Ja. Deshalb, wenn Sie eine Frage stellen, gibt es eine Box am unteren Rand, die Ihnen erlaubt, sie direkt vor der Frage zu beantworten. Für das Hinzufügen von "unnötigem Overhead" wird erwartet, dass Zäune ziemlich leicht sind. Die internen Treiber verarbeiten ständig Zäune, so dass * sie * erkennen können, wenn Sie mit einem Pufferobjekt fertig sind und so weiter. –

Verwandte Themen