게임 개발 공부/DirectX

'ID3D11Device'와 'ID3D11DeviceContext' 사용

CalebHong 2024. 1. 8. 22:58

수많은 GPU(그래픽카드)에 대한 하드웨어적인 연결을 마이크로소프트와 GPU제조사가 하도록 하며, 개발자는 DirectX에서 제공하는 ID3D11Device와 ID3D11DeviceContext를 통해 제공하는 기능에만 신경쓰면 되도록 설계된 COM 객체이다. 

 

COM(Component Object Model) 은 "객체의 내부를 노출하지 않고, 응용 프로그램이 호출할 수 있는 함수들만 노출하는 모델"을 의미한다.

따라서 COM객체는 인터페이스를 통해 참조하여 내부 함수를 호출하도록 설계되어 있다.

 

ID3D11Device* _device;
ID3D11DeviceContext* _deviceContext;

 

이런 식으로 쌩?포인터로 사용하게 되면, AddRef 함수나 Release 함수에 접근할 수 있다. 여기서 중요한 점은 메모리 누수와 관련된 참조 카운트(레퍼런스 카운트)가 있다는 점이다.

 

객체의 생성 후 소멸시킬 때 C++에서 일반적으로 delete을 통해 소멸시킬 수 없고, 참조 카운트가 0이 되면 자동으로 소멸하게 된다. 단, 사용이 끝나면 Release 함수를 호출해야 한다.

 

그러나 외부에서 참조하거나 가져다 사용하게 되면, 일일히 참조 카운트를 확인 후에 Release 함수를 호출해야 한다는 불편함이 존재한다. 따라서 쌩?포인터로 사용하는 것보단 아래와 같이 "스마트포인터"로 랩핑하여 사용하는 것이 사용하기에 좋다.

#include <wrl.h>
using namespace Microsoft::WRL;

ComPtr<ID3D11Device> _device;
ComPtr<ID3D11DeviceContext> _deviceContext;

 

마이크로소프트의 WRL의 ComPtr로 랩핑하게 되면, C#과 같이 자동으로 메모리를 관리해준다는 편리함이 있다.

'게임 개발 공부 > DirectX' 카테고리의 다른 글

모델이 화면에 표시되는 과정  (0) 2024.01.18
Render Pipeline 정리  (0) 2024.01.18