Notice
Recent Posts
Recent Comments
Link
«   2026/02   »
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
Tags
more
Archives
Today
Total
관리 메뉴

MOONSUN

[D3D] Comptr 사용해보자 본문

D3D

[D3D] Comptr 사용해보자

MoonSun_v 2025. 9. 5. 12:13

 

 

처음 D3D 프로젝트를 만들면서 Com 객체들을 안전하게 해제하도록 하는 매크로를 사용하고 있었는데 
Comptr을 활용하는 방식으로 변경했다.

 

그 내용에 대해서 간단하게 정리해보고자 한다..!

 

 


 

현재 NDC좌표계 좌표와 컬러값을 갖는 Vertex를 만들고 IndexBuffer를 사용해서 사각형 그리는 간단한 프로그램을 만들었다.

 

 

 

 

1. ( 기존 ) : Com 객체를 안전하게 해제 하는 매크로 만들어서 사용 

 

템플릿으로 매크로를 만들어서 COM 객체들을 사용해주고 해제해주었다. 

// COM 객체 안전 해제
template <typename T>
void SAFE_RELEASE(T* p)
{
    if (p)
    {
        p->Release();
        p = nullptr;
    }
}

 

// h. 
ID3D11Device* m_pDevice = nullptr;						
ID3D11DeviceContext* m_pDeviceContext = nullptr;		
IDXGISwapChain* m_pSwapChain = nullptr;				
ID3D11RenderTargetView* m_pRenderTargetView = nullptr;


// cpp. 
HR_T(D3D11CreateDeviceAndSwapChain(
	NULL,                           // 기본 어댑터 사용
	D3D_DRIVER_TYPE_HARDWARE,       // 하드웨어 렌더링 사용
	NULL,                           // 소프트웨어 드라이버 없음
	creationFlags,                  // 디버그 플래그
	NULL, NULL,                     // 기본 Feature Level 사용
	D3D11_SDK_VERSION,              // SDK 버전
	&swapDesc,                      // 스왑체인 설명 구조체
	&m_pSwapChain,                  // 스왑체인 반환
	&m_pDevice,                     // 디바이스 반환
	NULL,                           // Feature Level 반환 (사용 안 함)
	&m_pDeviceContext));            // 디바이스 컨텍스트 반환


// 해제
SAFE_RELEASE(m_pRenderTargetView); 
SAFE_RELEASE(m_pDeviceContext); 
SAFE_RELEASE(m_pSwapChain); 
SAFE_RELEASE(m_pDevice);

 

 

 

2. ( 수정 ) : Comptr 사용  

Comptr을 사용하도록 변경했다.

// 헤더 추가 
#include <wrl/client.h>
using Microsoft::WRL::ComPtr;

 

// h
ComPtr<ID3D11Device> m_pDevice;
ComPtr<ID3D11DeviceContext> m_pDeviceContext;
ComPtr<IDXGISwapChain> m_pSwapChain;
ComPtr<ID3D11RenderTargetView> m_pRenderTargetView;


// cpp

HR_T(D3D11CreateDeviceAndSwapChain(
	nullptr,						// 기본 어댑터 사용
	D3D_DRIVER_TYPE_HARDWARE,		// 하드웨어 렌더링 사용
	nullptr,						// 소프트웨어 드라이버 없음
	creationFlags,					// 디버그 플래그
	nullptr, 0,						// 기본 Feature Level 사용
	D3D11_SDK_VERSION,				// SDK 버전
	&swapDesc,						// 스왑체인 설명 구조체
	m_pSwapChain.GetAddressOf(),	// 스왑체인 반환
	m_pDevice.GetAddressOf(),		// 디바이스 반환
	nullptr,						// Feature Level 반환 (사용 안 함)
	m_pDeviceContext.GetAddressOf()	// 디바이스 컨텍스트 반환
));
    
    
// 해제 : 필요하면 Reset 가능. 나는 따로 해제 안해줌 
//        기존 SAFE_RELEASE 매크로 제거 
// m_pVertexBuffer.Reset();
// m_pIndexBuffer.Reset();
// m_pInputLayout.Reset();
// m_pVertexShader.Reset();
// m_pPixelShader.Reset();

 

 

특정 시점에서 강제로 해제하고 싶으면 Reset()을 사용하기!