Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

codingfarm

4. COM(Component Object Model) 본문

computer graphics/DX12 book

4. COM(Component Object Model)

scarecrow1992 2021. 1. 11. 20:32

COM

$\bullet$ 정의 : 어떤 프로그램이나 시스템을 이루는 컴포넌트들이 상호 통신할 수 있도록 하는 메커니즘

$\bullet$ COM을 이용하면 DirectX의 프로그래밍 언어 독립성과 하위 호환성을 가능하게 할 수 있다.

$\bullet$ COM 객체는 흔히 인터페이스라 부르지만, C++ 클래스로 간주해도 무방하므로 흔히 COM 객체라고 부른다.

$\bullet$ C++로 DirectX 응용프로그램을 프로그래밍 할 때 COM의 세부사하은 대부분 프로그래머에게 드러나지 않는다.

$\bullet$ 프로그래머가 알아야 할 것

-필요한 COM 인터페이스를 가리키는 포인터를 특별한 함수들을 이용해서, 또는 다른 COM 인터페이스의 메서드를 이용해서 얻는 방법 뿐이다.

$\bullet$ COM 인터페이스를 new나 delete를 이용해서 생성, 삭제할 수 없다.

- 반드시 생성을 위한 별도의 API 함수(Release 메서드)를 써야한다.

$\bullet$ 모든 COM 인터페이스는 IUnknow이라는 COM 인터페이스의 기능을 상속하는데, 그 인터페이스가 Release라는 메서드를 제공한다.

$\bullet$ COM 객체는 참조횟수가 0이 되면 메모리에서 해제된다.

$\bullet$ COM 객체의 수명 관리를 돕기 위해, Windows 런타임 라이브러리(WRL)은 Microsoft::WRL::Comptr 이라는 클래스를 제공한다(wrl.h 헤더파일을 인클루드 해야 사용가능하다.)

-ComPtr 클래스는 COM 객체를 위한 smart pointer라 할 수 있으며, 이 클래스를 쓰면 개발자가 직접 Release를 호출할 필요가 없다.

-ComPtr의 여러 메서드 중 이후 포스팅에서 사용하는 것은 다음 세가지이다.

 

1. Get : 바탕 COM 인터페이스를 가리키는 포인터를 돌려준다.

해당 COM 인터페이스 포인터 형식의 인수를 받는 함수를 호출할 때 쓰인다.

ComPtr<ID3D12RootSignature> mRootSignature;

...

// SetGraphicsRootSignature는 ID3D12RootSignature* 형식의 인수를 받는다.
mCommandList->SetGraphicsRootSignature(mRootSignature.Get());

 

2. GetAddressOf : 바탕 COM 인터페이스를 가리키는 포인터의 주소를 돌려준다. 함수 매개변수를 통해서 COM 인터페이스 포인터를 돌려받을 때 흔히 쓰인다.

ComPtr<ID3D12CommandAllocator> mDirectCmdListAlloc;

ThrowIfFailed(md3dDevice->CreateCommandAllocator
    D3D12_Command_LIST_TYPE_DIRECT,
    mDirectCmdListAlloc.GetAddressOf()));

 

3. Reset : Comptr 인스턴스를 nullptr로 설정하고 바탕 COM 인터페이스의 참조 횟수를 1 감소한다. 이 메서드를 사용하는 대신 ComPtr 인스턴스에 직접 nullptr를 배정해도 된다(역시 참조 횟수가 감소한다.)

 

COM은 이보다 훨씬 방대한 주제이지만, DirectX를 효과적으로 사용하는 데에는 이정도로 충분하다.

 

참고 : COM 인터페이스들은 이름이 대문자 I로 시작한다. 가령 명령 목록(command list)를 나타내는 COM 인터페이스의 이름은 ID3D12GraphicsCommandList이다.

Comments