Deferred Context를 이용하여 텍스처를 수정하고 렌더링하는 과정에서
D3D11 WARNING: ID3D11Device::RemoveContext: Deferred Context removal has been triggered for the following reason (어쩌구 저쩌구...)
라는 엄청 긴 메세지와 함께 프로그램은 실행되고 있지만, DebugView에서 엄청나게 많은 메세지를 찍어대면서 몇개의 영상이 멈추었다.
그래서 인터넷에 찾아보니 ID3D11CommandList는 SAFE_RELEASE()를 매크로를 사용하지말고 그냥 Release() 함수를 사용해야만 한다고 한다.
// Deferred Execute
for (int i = 0; i < DEFERRED_COUNT; ++i)
{
if (m_pDX11DisplayProperty->m_pRenderingCommandList[i] != nullptr)
{
DeviceContext->ExecuteCommandList(m_pDX11DisplayProperty->m_pRenderingCommandList[i], TRUE);
//SAFE_RELEASE(m_pDX11DisplayProperty->m_pRenderingCommandList[i]); // <-- 이렇게 사용하면 안됨.
m_pDX11DisplayProperty->m_pRenderingCommandList[i]->Release();
}
//m_pUpdateClass[i].m_pKeyedMutex->ReleaseSync(uRelKey);
}
출처 : https://community.amd.com/thread/128535
위에 이야기는 테스트 결과로 봤을 때 잘못된 정보였다 !!!!
결과만 말하면 FinishCommandList()가 ExecuteCommandList()보다 많이 호출되어 CommandList의 데이터가 소모가 되지 않고 쌓이기 때문에 Memory Leak 처럼 보인 것이다.
항상 ExecuteCommandList()가 FinishCommandList() 보다 더 많이 호출될 수 있게 하도록 하자.
'Visualization Programming > DirectX11' 카테고리의 다른 글
DirectX11 - Device Lost (0) | 2016.10.24 |
---|---|
DirectX11 - OMSetRenderTargets() 사용시 주의사항 (0) | 2016.10.06 |
DirectX11 - UpdateSubResource(), Map() ~ Unmap(), CopyResource(), CopySubresourceRegion()의 팁 (0) | 2016.04.15 |
DirectX11 - Dispatch()와 [numthreads] (0) | 2016.03.28 |
DirectX11 - DirectCompute 메모리 모형 (0) | 2016.03.16 |