2015-01-25 2 views
0

저는 C++로 게임을 제작 중이며 메모리 누수로부터 자신을 보호하기 위해 처음부터 모든 것을 올바르게하고 싶습니다.DirectX, 참조 카운트 및 스마트 포인터

현재 모든 direct3D 항목을 포함하는 D3D 클래스가 있습니다.

그러나 내 Render() 메소드는 어느 시점에서 DeviceContext에 액세스해야합니다. 그것을 얻으려면, 내 D3D 클래스 자체 내에서 ID3D11DeviceContext 포인터를 반환해야합니다. 이것은 참조 수를 늘리지 않고 그 COM 객체에 대한 다른 참조를 가짐을 의미합니다. 예를 들어

:

Render() 
{ 
    m_d3d.GetDevCon()->DoWhatever(); 
} 

내가 의미처럼 사용할 수 나는 포인터의 외부 복사본을 만들 필요가 없습니다? 이게 안전할까요? 나는 그런 잠재적으로이 같은 일이 나쁜 일에서 내 프로그램을 보호하기 위해 할 수있는 일이 있습니까 :

Render() 
{ 
    ID3D11DeviceContext* devCon = m_d3d.GetDevCon(); 
    devCon->DoWhatever(); 
} 

나는이 참조 횟수가 참조의 실제 수와 일치하지 않을 의미 볼 수 있었다.

본질적으로 가능한 한 원시 포인터를 사용하지 않으려합니다. 나는 스마트 포인터를 사용하는 것뿐만 아니라 사용할 때도 알기를 원합니다.

+1

렌더링 클래스의 std :: unique_ptr이 필요한 것을 해결하지 못하는 이유는 무엇입니까? – PDizzle745

+0

그것은 할 수도 있지만 스마트 포인터에 대한 나의 지식은 막연하다. 나는 그것을 사용하는 방법에 대한 첫 번째 단서가 없다. – Mark

+0

포인터가 * 자리에 앉지 않도록하려는 것 같습니다. *; 'GetDevCon'가 포인터가 아닌 DeviceContext에 대한 참조를 리턴하도록 고려하십시오. –

답변

1

Direct3D 개체와 같은 COM 개체의 경우 스마트 포인터 Microsoft::WRL::ComPtr (Win32 데스크톱 응용 프로그램을 비롯한 모든 C++ 응용 프로그램에서 Windows 8.x SDK와 함께 사용 가능)을 사용해야합니다.

std::unique_ptrstd::shared_ptr과 같이 많은 용도로 적합하지만 COM 개체에서는 잘 작동하지 않습니다.

ID3D11DeviceContext을 해제 할 수있는 다른 스레드가 없으면 참조 카운트를 증가시키지 않고 원시 포인터를 사용하는 것이 안전합니다. 렌더링을 실행하는 스레드가 아닌 다른 스레드에서이를 수행하는 이상한 프로그램이 될 것입니다. 즉

Render() 
{ 
    ID3D11DeviceContext* devCon = m_d3d.GetDevCon(); 
    devCon->DoWhatever(); 
} 

, 업데이트의 표준 게임 루프에// 현재 렌더링, 당신은 단지 그것으로 렌더링하는 (즉 refcount가 증가) '강한 참조'를 만들 필요가 없습니다, 당신은 안전하게 할 수 명확한 초기화 프로세스가있는 한 'weak reference'(즉, 참조 횟수를 증가시키지 않고 포인터)를 사용합니다. 즉, 장치/컨텍스트는 해당 게임 루프의 특정 지점에서만 파괴되거나 재현 될 수 있습니다 (즉, 업데이트 또는 렌더링의 중간, 실패한 현재에 대한 응답).

자세한 내용은 Smart Pointers (Modern C++)Direct3D Win32 Game Visual Studio template을 참조하십시오.

this 기사에서 유용한 스마트 포인터의 다양한 '예외 안전'사용 예를 찾을 수 있습니다.

+0

나는 성능을 너무 많이 내지 않고도 메모리를 안전하게 만들려고 노력하고 있습니다. 필자가 상당히 합리적인 프로그래머이기 때문에 필자가 사용하는 동안은 완벽하게 안전합니다. 그러나 결국 다른 사람들의 공헌에 이것을 열어두고 잘못된 결과를 내기 위해 그것을 설정하려고합니다. – Mark

+0

cMain에서 ID3D11DeviceContext *를 직접 사용하는 것이 얼마나 빨리 cD3D에서 래핑하고 메서드에서 참조 해제되는 것입니까? – Mark

+0

가장 사소한 드로잉 케이스를 제외하면 그림과 같이 시간이 많이 걸리는 작업과 게임의 계산에 비하면 정말 작습니다. 즉, ref-counts를 증가시키고 불필요하게 동일한 프레임에서 그 카운트를 감소시키지 않기를 바란다. COM smartpointer를 위해 집에서 굴러 다니는 silliness보다는''Microsoft :: WRL :: ComPtr''를 사용하십시오. –