Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menguruskan Objek OpenGL dengan Selamat dalam Kelas C RAII?

Bagaimanakah Saya Boleh Menguruskan Objek OpenGL dengan Selamat dalam Kelas C RAII?

Susan Sarandon
Susan Sarandonasal
2024-11-25 10:52:11462semak imbas

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

OpenGL Objects dalam Kelas C RAII: Perangkap dan Penyelesaian

Dalam kelas C RAII, ahli dilepaskan secara automatik apabila objek keluar dari skop untuk memastikan pengagihan sumber. Walau bagaimanapun, apabila berurusan dengan objek OpenGL dalam kelas sedemikian, akibat yang tidak diingini boleh timbul.

Pertimbangkan kod berikut:

class BufferObject
{
private:
  GLuint buff_;

public:
  BufferObject() { glGenBuffers(1, &buff_); }
  ~BufferObject() { glDeleteBuffers(1, &buff_); }
  // Other members
};

Kelas ini menguruskan objek penimbal OpenGL, yang harus dipadamkan dalam pemusnah. Walau bagaimanapun, ralat yang tidak dijangka berlaku apabila cuba menyalin atau memindahkan-membina objek ini.

Isu ini berpunca daripada kekurangan salinan eksplisit atau memindahkan pembina/pengendali tugasan. Pembina salinan yang dijana pengkompil hanya menyalin pembolehubah ahli, membawa kepada dua objek berkongsi objek penimbal OpenGL yang sama. Apabila satu objek dimusnahkan, yang lain menjadi tidak sah, mengakibatkan ralat.

Begitu juga, fungsi InitBuffer:

BufferObject InitBuffer()
{
  BufferObject buff;
  // Do stuff with `buff`
  return buff;
}

juga gagal kerana buff dimusnahkan selepas disalin ke dalam nilai pulangan.

Untuk menyelesaikan masalah ini, jenis bergerak sahaja harus digunakan. Dalam C , ini bermakna memadamkan pembina salinan dan pengendali penugasan salinan, sambil menyediakan persamaan pemindahan yang memindahkan pemilikan:

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
};

Dengan perubahan ini, penyalinan dan pemindahan contoh BufferObject menjadi selamat dan sumber OpenGL diurus dengan betul dalam corak RAII.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menguruskan Objek OpenGL dengan Selamat dalam Kelas C RAII?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn