Heim > Backend-Entwicklung > C++ > Wie kann ich OpenGL-Objekte innerhalb von C-RAII-Klassen sicher verwalten?

Wie kann ich OpenGL-Objekte innerhalb von C-RAII-Klassen sicher verwalten?

Susan Sarandon
Freigeben: 2024-11-25 10:52:11
Original
465 Leute haben es durchsucht

How Can I Safely Manage OpenGL Objects within C   RAII Classes?

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
};
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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
};
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage