Очистка directx, правильное освобождение ком-ссылок - PullRequest
1 голос
/ 10 июня 2011

Я только учусь Directx.Обычно создается устройство Directx и несколько других COM-интерфейсов через вызовы функций, такие как

ID3D11CreateDeviceAndSwapChain(.... ,& device, ...);

. Во всем коде учебника, который я видел, com-интерфейсы выпускаются с использованием чего-то, похожего на

if (pointer_to_com_object) {
    pointer_to_com_object->Release(); 
    pointer_to_com_object = 0;
}

например, следующее взято из Tutorial07_2008 в руководствах по Microsoft DirectX 11.

if( g_pSamplerLinear ) g_pSamplerLinear->Release();
if( g_pTextureRV ) g_pTextureRV->Release();
if( g_pCBNeverChanges ) g_pCBNeverChanges->Release();
if( g_pCBChangeOnResize ) g_pCBChangeOnResize->Release();
if( g_pCBChangesEveryFrame ) g_pCBChangesEveryFrame->Release();
if( g_pVertexBuffer ) g_pVertexBuffer->Release();
if( g_pIndexBuffer ) g_pIndexBuffer->Release();
if( g_pVertexLayout ) g_pVertexLayout->Release();
if( g_pVertexShader ) g_pVertexShader->Release();
if( g_pPixelShader ) g_pPixelShader->Release();
if( g_pDepthStencil ) g_pDepthStencil->Release();
if( g_pDepthStencilView ) g_pDepthStencilView->Release();
if( g_pRenderTargetView ) g_pRenderTargetView->Release();
if( g_pSwapChain ) g_pSwapChain->Release();
if( g_pImmediateContext ) g_pImmediateContext->Release();
if( g_pd3dDevice ) g_pd3dDevice->Release();

Как указано в ответах на этот вопрос COM-объекты могут иметь ссылки на них, которые вы не указали 't own.

Так вышеприведенный плохой способ очистить DirectX или у COM-объектов Directx никогда не будет ссылок на них, которые вы не создали?

Я просто спрашиваю, потому что я все время вижу этосделал так, как я учусь.

1 Ответ

4 голосов
/ 10 июня 2011

COM-объекты подсчитываются.Когда вы звоните Release(), вы фактически уменьшаете внутренний счетчик ссылок.Если другой объект все еще владеет ссылкой, он не будет уничтожен.

Если какая-то другая часть приложения получит новую ссылку на COM-объект, убедитесь, что вы вызвали Release(), когда закончите сЭто.Внимательно прочитайте документацию о методах, которые возвращают ссылки, чтобы узнать, нужно ли вам вызывать Release() или нет.Обычно вам придется.

Например, в документации IDirect3DTexture9 :: GetSurfaceLevel :

Вызов этого метода приведет к увеличению внутреннего счетчика ссылок в интерфейсе IDirect3DSurface9.Сбой вызова IUnknown :: Release по окончании использования этого интерфейса IDirect3DSurface9 приводит к утечке памяти.

...