Es hängt ausschließlich von dem OpenGL-Aufruf und dem OpenGL-Status ab. Wenn Sie OpenGL-Aufrufe ausführen, reiht die Implementierung sie zunächst intern in die Warteschlange ein und führt sie dann asynchron zur Ausführung des aufrufenden Programms aus. Ein wichtiges Konzept von OpenGL sind Synchronisationspunkte. Dies sind Vorgänge in der Arbeitswarteschlange, bei denen der OpenGL-Aufruf blockiert werden muss, bis bestimmte Bedingungen erfüllt sind.
OpenGL-Objekte (Texturen, Pufferobjekte, etc.) sind rein abstrakt und per Spezifikation das Handle eines Objekts im Client-Programm immer auf die Daten, das Objekt hat zum Aufrufzeitpunkt von OpenGL-Funktionen, die auf dieses Objekt verweisen. So nehmen beispielsweise diese Sequenz:
glBindTexture(GL_TEXTURE_2D, texID);
glTexImage2D(..., image_1);
draw_textured_quad();
glTexImage2D(..., image_2);
draw_textured_quad();
Die erste draw_textured_quad
zurückkehren kann sogar lange bevor irgendetwas gezogen wurde. Durch die Aufrufe erzeugt OpenGL jedoch einen internen Verweis auf die Daten, die derzeit von der Textur gehalten werden. Wenn also glTexImage2D ein zweites Mal aufgerufen wird, was vor dem Zeichnen des ersten Quads passieren kann, muss OpenGL intern ein sekundäres Texturobjekt erstellen, das zur Textur texID
wird und von den zweiten Aufrufen von draw_textured_quad
verwendet wird. Wenn glTexSubImage2D
aufgerufen wurde, müsste es sogar eine modifizierte Kopie davon machen.
OpenGL-Aufrufe werden nur blockiert, wenn das Ergebnis des Aufrufs den clientseitigen Speicher ändert und von Daten abhängt, die von früheren OpenGL-Aufrufen generiert wurden. Mit anderen Worten, wenn OpenGL-Aufrufe ausgeführt werden, generiert die OpenGL-Implementierung intern eine Abhängigkeitsstruktur, um zu verfolgen, was von was abhängt. Und wenn ein Synchronisationspunkt blockiert werden muss, blockiert er mindestens, bis alle Abhängigkeiten erfüllt sind.
Ja, sie würden im Allgemeinen blockierende Funktionen, ich bin nicht sicher, wie ich es vorher nicht getan habe, aber ich nehme an, dass es auf einer Schleife ausgeführt würde und nur aktualisiert, wenn nötig, um die Framerate hoch zu halten. – PsyKzz
@MattPsyK: OpenGL-Funktionen, die keinen Synchronisationspunkt einführen, werden nicht blockiert. – datenwolf
Meine schlechten Annahmen wurden getroffen. – PsyKzz