2-1. DirectX 11 장치 초기화 (COM)

박재수 ㅣ 2023. 8. 20. 15:30

2장에서 나의 목표는 아래와 같다.

  1. 3차원 그래픽 하드웨어의 프로그래밍에서 Direct3D의 역할을 개괄적으로 이해한다.
  2. Direct3D에서 COM의 역할을 이해한다.
  3. 2차원 이미지의 저장 방식, 페이지 전환, 깊이 버퍼링, 다중 표본화 같은 기초 그래픽 개념들을 배운다.
  4. 성능 카운터 함수들을 이용해서 고해상도 타이머 값을 얻는 방법을 배운다.
  5. Direct3D를 초기화하는 방법을 파악한다.
COM (Component Object Model)

COM은 DirectX의 프로그래밍 언어 독립성과 하위 호환성을 가능하게 하는 기술이다.

프로그래머가 알아야 할 것은 필요한 COM 인터페이스로의 포인터를 특별한 함수들 또는 다른 COM 인터페이스의 메서드를 이용해서 얻는 방법뿐이다.

COM 인터페이스는 C++의 new 키워드를 생성하지 않는다. 또 한 가지 기억해야 할 것은, 인터페이스를 다 사용하고 난 후에는 delete로 삭제하는 것이 아니라 그 인터페이스의 Release 메서드를 호출해 주어야 한다는 것이다. ( 모든 COM 인터페이스는 IUnknown이라는 COM 인터페이스의 기능을 상속받는데, 그 인터페이스가 Release라는 메서드를 제공한다.) 이는 COM 객체들이 자신만의 고유한 방식으로 메모리를 관리하기 때문이다.

참고 : COM 인터페이스들은 이름이 대문자 I로 시작한다. 예를 들어 2차원 텍스처를 나타내는 COM 인터페이스는 ID3D11Texture2D이다.

물방울 책만 보았을 때는 COM이 무엇인지 솔직히 이해가 안간다.
직관적으로는 Smart Pointer와 비슷한 개념의 Reference Count를 증감하여 사용하지 않는 메모리를 해제 하는 것인가 싶기도 한데 따로 COM을 사용하는 이유가 있을 것이다.
책에 나와있는 IUnknown 인터페이스를 살펴보면
MIDL_INTERFACE("00000000-0000-0000-C000-000000000046")
IUnknown
        {
        public:
            BEGIN_INTERFACE
            virtual HRESULT STDMETHODCALLTYPE QueryInterface( 
                /* [in] */ REFIID riid,
                /* [iid_is][out] */ _COM_Outptr_ void __RPC_FAR *__RPC_FAR *ppvObject) = 0;

            virtual ULONG STDMETHODCALLTYPE AddRef( void) = 0;

            virtual ULONG STDMETHODCALLTYPE Release( void) = 0;

            template<class Q>
            HRESULT
#ifdef _M_CEE_PURE
            __clrcall
#else
            STDMETHODCALLTYPE
#endif
            QueryInterface(_COM_Outptr_ Q** pp)
            {
                return QueryInterface(__uuidof(Q), (void **)pp);
            }

            END_INTERFACE
        };​
책에 나와있듯이 AddRef(void) 메서드와 Release(void) 메서드로 Reference Count를 수동으로 관리를 한다.
MIDL_INTERFACE("00000000-0000-0000-C000-000000000046")는 순수 인터페이스 선언(__declspec(novtable))과 IUnknown 인터페이스의 uuid를 정의하는 부분이라고 한다.( uuid, riid, guid 전부 고유한 식별자를 나타내는 용어인데 COM에서는 인터페이스를 식별하기위해 riid라는 용어를 쓴다고 한다. 보통은 uuid라는 용어를 사용하는데 Microsoft에서는 같은 개념이지만 guid라는 용어를 쓴다고 한다.. 헷갈린다; )
그래서 COM이 뭔데?

정확히는 모르겠지만 다른 버전 라이브러리와의 호환성을 위해 Smart Pointer를 사용하지 않고 IUnknown 인터페이스와 UUID를 사용해서 호환성과 메모리를 관리하도록 하는 건가 싶다.. 계속 공부해서 자세히 이해하게 되면 다시 수정해야겠다.

'DirectX' 카테고리의 다른 글

2-3. 교환 사슬과 페이지 전환 (SwapChain)  (0) 2023.09.18
2-2. 텍스처 및 자료 자원 형식  (1) 2023.09.18
1. Rendering Pipeline  (1) 2023.07.01