繁体   English   中英

使用CreateTexture2D后,我应该在ID3D10Device接口上调用Release吗? 为什么?

[英]Should I call Release on a ID3D10Device interface after using CreateTexture2D? why?

我在directx10项目中使用了这段代码。

ID3D10Texture2D *depthStencilBuffer;
UINT a = m_device->Release();
if(FAILED(hr = m_device->CreateTexture2D( &descDepth, NULL, &depthStencilBuffer ))) {
    DXGI_D3D10_ErrorExit(hr, L"CreateTexture2D");
    return hr;
}
a = m_device->Release();

现在,如果我停在三线调试和检查的价值a它说2.当我最后一个后在该行停止它,它说。我不明白为什么。 CreateTexture2D函数是否添加了对ID3D10Device接口的引用? 显然它甚至没有添加一个引用,但是因为Release()减少了一个而引入了两个引用。 我的问题是ID3D10Device::CreateTexture2D的文档没有指定它添加对ID3D10Device对象的引用。 例如,对于ID3D10Device::CreateRenderTargetView也是如此。 我该如何猜测何时拨打Release

我没有能力安装DirectX SDK来测试它,但是,在一般原理中,当涉及到COM时,你应该遵循COM规则并相信其他对象也遵循规则。

即你不应该知道Texture2D的实现,但你应该相信,如果它需要添加对设备的引用,它也将在完成时删除它们。 您不应该尝试对Release()进行其他调用。

您的代码应为:

ID3D10Texture2D *depthStencilBuffer = NULL;
if(FAILED(hr = m_device->CreateTexture2D( &descDepth, NULL, &depthStencilBuffer ))) {
    DXGI_D3D10_ErrorExit(hr, L"CreateTexture2D");
    return hr;
}
depthStencilBuffer->Release();
depthStencilBuffer = NULL;

即你应该期望调用返回一个引用计数为1的texture2d,这是你需要知道的。 当你完成后,你应该只在depthStencilBuffer上调用release,并期望它完全自我清理。 如果在实现过程中模板缓冲区需要对设备的引用,您应该相信它也会正确调用这些引用的释放。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM