ホームページ >バックエンド開発 >C++ >C で RAII を使用するときに OpenGL エラーを回避するにはどうすればよいですか?

C で RAII を使用するときに OpenGL エラーを回避するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-25 22:14:111029ブラウズ

How to Avoid OpenGL Errors When Using RAII in C  ?

C RAII クラスでの OpenGL オブジェクトの問題の解決

背景

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。