背景
C では、RAII (リソースの取得は初期化) です。リソースの自動クリーンアップを確実にするために採用されています。オブジェクトがスコープ外になると、そのデストラクターが呼び出され、保持しているリソースがすべて解放されます。
問題
RAII を通じて管理される OpenGL オブジェクトを含む C クラスを考えてみましょう。
class BufferObject { public: BufferObject() { glGenBuffers(1, &buff_); } ~BufferObject() { glDeleteBuffers(1, &buff_); } };
ベクトルへの格納や関数からの戻りなど、特定のシナリオで使用すると、OpenGL で問題が発生します。エラー。
分析
この問題は、適切なコピー/移動セマンティクスが欠如していることが原因で発生します。オブジェクト (push_back など) をコピーする場合、メンバー変数のみがコピーされ、両方のオブジェクトは同じ OpenGL バッファー オブジェクトのままになります。破棄されると、最初のオブジェクトはバッファを削除し、2 番目のオブジェクトを無効にします。
解決策: 移動セマンティクスの実装
これを解決するには、クラスを移動のみのタイプで、コピー コンストラクターとコピー代入演算子が削除されます。代わりに、リソースの所有権を譲渡する移動コンストラクターと移動代入演算子を提供する必要があります。
class BufferObject { public: BufferObject(const BufferObject &) = delete; BufferObject &operator=(const BufferObject &) = delete; BufferObject(BufferObject &&other) : buff_(other.buff_) { other.buff_ = 0; } BufferObject &operator=(BufferObject &&other) { if (this != &other) { Release(); buff_ = other.buff_; other.buff_ = 0; } return *this; } };
これにより、常に 1 つのオブジェクトだけが OpenGL バッファーを所有することが保証されます。
以上がC で RAII を使用するときに OpenGL エラーを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。