Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menguruskan Objek OpenGL dengan Selamat dalam Kelas C RAII?
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!