코가손의 블로그

[DirectX12] COM(Component Object Model) 본문

GameDev/DirectX12

[DirectX12] COM(Component Object Model)

Cogason 2021. 11. 15. 20:53

COM(Component Object Model)은 DirectX의 프로그래밍 언어 독립성과 하위 호환성을 가능하게 하는 기술이다. C++클래스로 간주하고 사용해도 무방하기 때문에 주로 COM객체라고 부른다.

사용자는 대부분의 COM인터페이스의 세부사항을 볼 수 없다.

 

COM 객체는 new나 delete를 이용할 수 없고 반드시 별도의 API함수를 써 생성해야 하며 Release메서드를 호출해 주어야 한다.

- 모든 COM 인터페이스는 IUnknown이라는 COM인터페이스의 기능을 상속, 여기서 Release메소드 제공)

 

사용자는 COM인터페이스 포인터를 AddRef메서드를 사용해야지만 다른 변수에 복사할 수 있다.

 

COM인터페이스들의 이름은 대문자 'I'로 시작한다.

명령 목록을 나타내는 COM인터페이스의 이름은 ID3D12GraphicsCommandList이다.

 

COM객체의 생성과 소멸

ID3D12Device *pd3dDevice = NULL;

// Device COM 객체 생성
D3D12CreateDevice(NULL, ..., &pd3dDevice, ...);

ID3D12Device *pd3dDeviceCopied = pd3dDevice; // 포인터로 참조, 객체를 변수에 복사하고 싶다면
pd3dDeviceCopied->AddRef();                  // AddRef() 호출 해주어야 함

pd3dDeviceCopied->Release();                 // 사용하지 않으면 Release()도 반드시 호출

pd3dDevice->Release();

초기화 시 NULL이었던 pd3dDevice포인터가 API함수(CreateDevice)를 거치며 COM객체를 생성하고 pd3dDevice의 주소를 참조하게 된다. COM객체가 아닌 경우의 API 함수들은 객체 포인터의 주소가 아닌 그냥 주소를 넘겨준다고 한다.

 

GUID

GUID(Globally Unique IDentifire)는 인터페이스 클래스 식별자(ID)를 나타내는 128bit(16byte)정수 문자열이다.

COM인터페이스들을 구별하기 위해 GUID가 사용되며 서로 호환되지 않을 수 있는 두개의 COM이 동일한 인터페이스 이름을 사용하더라도 GUID덕분에 구별이 가능하다.

 

__uuidof연산자와 IID_PPV_ARGS매크로 중 하나를 사용하여 비교적 쉽게 인터페이스 자료형, 클래스 이름, 인터페이스 포인터에 알맞는 GUID를 얻을 수 있다.

ID3D12Device* pd3dDevice;

// __uuidof 사용시
D3D12CreateDevice(..., __uuidof(ID3D12Device), &pdDevice);

// IID_PPV_ARGS 매크로 사용시
D3D12CreateDevice(..., IID_PPV_ARGS(&pd3dDevice);

 

또한 COM객체의 수명 관리를 돕기 위해 ComPtr클래스를 제공한다.

스마트 포인터와 같이 참조 횟수를 관리하여 객체가 소멸할 때 자동으로 Release를 호출해 준다.

DX12프로그래밍을 할 땐 ComPtr클래스를 이용한다.

 

 

출처 : https://lipcoder.tistory.com/entry/DirectX-12-COMComponent-Object-Model?category=843243

'GameDev > DirectX12' 카테고리의 다른 글

[DirectX12] 렌더링 파이프라인  (0) 2021.11.23
[DirectX12] 텍스처 형식  (0) 2021.11.16
Comments