>백엔드 개발 >C++ >C RAII 클래스 내에서 OpenGL 개체를 어떻게 안전하게 관리할 수 있습니까?

C RAII 클래스 내에서 OpenGL 개체를 어떻게 안전하게 관리할 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-25 10:52:11505검색

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

C RAII 클래스의 OpenGL 개체: 함정 및 해결 방법

C RAII 클래스에서는 개체가 범위를 벗어나면 멤버가 자동으로 해제됩니다. 리소스 할당 해제를 보장합니다. 그러나 이러한 클래스에서 OpenGL 객체를 처리할 때 의도하지 않은 결과가 발생할 수 있습니다.

다음 코드를 고려하세요.

class BufferObject
{
private:
  GLuint buff_;

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

이 클래스는 OpenGL 버퍼 객체를 관리하며, 오물 소각로. 그러나 이러한 객체를 복사하거나 이동 구성하려고 하면 예기치 않은 오류가 발생합니다.

이 문제는 명시적인 복사 또는 이동 생성자/할당 연산자가 없기 때문에 발생합니다. 컴파일러에서 생성된 복사 생성자는 단순히 멤버 변수를 복사하여 동일한 OpenGL 버퍼 객체를 공유하는 두 객체로 이어집니다. 한 객체가 소멸되면 다른 객체가 유효하지 않게 되어 오류가 발생합니다.

마찬가지로 InitBuffer 함수

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

도 버프가 반환 값에 복사된 후 소멸되기 때문에 실패합니다.

이러한 함정을 해결하려면 이동 전용 유형을 사용해야 합니다. C에서 이는 복사 생성자와 복사 할당 연산자를 삭제하는 동시에 소유권을 이전하는 이동 등가물을 제공하는 것을 의미합니다.

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

이러한 변경을 통해 BufferObject 인스턴스 복사 및 이동이 안전해지고 OpenGL 리소스가 내에서 올바르게 관리됩니다. RAII 패턴.

위 내용은 C RAII 클래스 내에서 OpenGL 개체를 어떻게 안전하게 관리할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.