OpenGL-Objekte in C-RAII-Klassen: Fallstricke und Lösungen
In C-RAII-Klassen werden Mitglieder automatisch freigegeben, wenn das Objekt den Gültigkeitsbereich verlässt um die Freigabe von Ressourcen sicherzustellen. Beim Umgang mit OpenGL-Objekten in solchen Klassen können jedoch unbeabsichtigte Folgen auftreten.
Beachten Sie den folgenden Code:
class BufferObject { private: GLuint buff_; public: BufferObject() { glGenBuffers(1, &buff_); } ~BufferObject() { glDeleteBuffers(1, &buff_); } // Other members };
Diese Klasse verwaltet ein OpenGL-Pufferobjekt, das in der gelöscht werden sollte Zerstörer. Beim Versuch, diese Objekte zu kopieren oder zu verschieben und zu konstruieren, treten jedoch unerwartete Fehler auf.
Das Problem ist auf das Fehlen expliziter Kopier- oder Verschiebungskonstruktoren/Zuweisungsoperatoren zurückzuführen. Der vom Compiler generierte Kopierkonstruktor kopiert einfach die Mitgliedsvariablen, was dazu führt, dass zwei Objekte dasselbe OpenGL-Pufferobjekt teilen. Wenn ein Objekt zerstört wird, wird das andere ungültig, was zu Fehlern führt.
Ähnlich schlägt auch die InitBuffer-Funktion:
BufferObject InitBuffer() { BufferObject buff; // Do stuff with `buff` return buff; }
fehl, weil Buff zerstört wird, nachdem es in den Rückgabewert kopiert wurde.
Um diese Fallstricke zu beseitigen, sollten Nur-Verschiebungs-Typen verwendet werden. In C bedeutet dies, den Kopierkonstruktor und den Kopierzuweisungsoperator zu löschen und gleichzeitig Verschiebungsäquivalente bereitzustellen, die den Besitz übertragen:
class BufferObject { private: GLuint buff_; public: BufferObject() { glGenBuffers(1, &buff_); } BufferObject(const BufferObject&) = delete; // no copy constructor BufferObject& operator=(const BufferObject&) = delete; // no copy assignment BufferObject(BufferObject&& other) : buff_(other.buff_) { other.buff_ = 0; } BufferObject& operator=(BufferObject&& other) { if(this != &other) { Release(); // release current resource buff_ = other.buff_; other.buff_ = 0; } return *this; } ~BufferObject() { Release(); } void Release() { if(buff_) glDeleteBuffers(1, &buff_); } // Other members };
Mit diesen Änderungen wird das Kopieren und Verschieben von BufferObject-Instanzen sicher und OpenGL-Ressourcen werden darin korrekt verwaltet das RAII-Muster.
Das obige ist der detaillierte Inhalt vonWie kann ich OpenGL-Objekte innerhalb von C-RAII-Klassen sicher verwalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!