c++ - 如何/何时在 DirectX 中释放资源和资源 View

标签 c++ resources directx

我正在开发 DirectX 11 演示应用程序,并偶然发现了以下问题:
当我从文件创建着色器资源 View (假设是纹理)时,我必须在使用后释放它,就像所有其他 D3D11 对象一样。但是隐式创建的底层资源又如何呢?

我可以想象三种场景:
+ 我应该保留该资源。它是通过调用 someShaderResourceView->Release()
来释放的 + 我应该将它与着色器资源 View 对象一起手动释放。
+ 我应该立即发布它。这似乎有效,尽管对我来说似乎不合理。

处理这个问题的正确方法是什么?

编辑:我正在使用 DirectXTex 纹理加载库,但我想保持问题的一般性。

ID3D11Resource *resource;
ID3D11ShaderResourceView *resourceView;
HRESULT result = CreateWICTextureFromFile(device, path.c_str(), &resource, &texture, 0);
//resource->Release(); ???

除了 CreateWICTextureFromFile(...),也可以使用旧的 D3DX11 函数 D3DX11CreateShaderResourceViewFromFile(...)

最佳答案

Direct3D 使用引用计数(通过 AddRefRelease)方法来控制对象生命周期,但有一些特定的怪癖,因为它不遵循一般规则的所有规则组件对象模型 (COM)。

具体来说,如果对对象的唯一引用是在设备上下文上设置它(也称为将其绑定(bind)到渲染管道),则不足以使其保持事件状态,因为这些方法不不增加/减少引用计数。请参阅Microsoft Docs 。因此,您的程序需要保留对其当前使用的 Direct3D 对象的一些其他引用。

另一个区别是,如果 ID3D11Device 由于引用计数为零而被销毁,那么它的所有 ID3D11DeviceChild 对象的引用计数是多少并不重要,并且这些在那时都是无效的。

您还应该记住,Direct3D 对象直到将来某个时刻才会真正被销毁(也称为延迟销毁),因此即使引用计数为零,也可能需要几帧才能完全清除。如果您正在处理大量事件资源并且必须担心过度提交,那么这一点尤其重要 - 顺便说一句,您可以使用 ID3D11DeviceContext::Flush 强制完成待处理的销毁,但它是经常这样做对于性能来说并不是一个好的做法。

TL;DR:ID3D11ShaderResourceView 对象向引用的 ID3D11Resource 对象添加了引用计数,因此只要 SRV 处于事件状态,资源也保持事件状态。您只需获取 CreateWICTextureFromFile 的返回对象之一,但如果需要,也可以同时获取两者。请参阅wiki有关更多信息,请参阅 WICTextureLoader 模块页面。

This is a good reason to learn to use the ComPtr smart-pointer. It takes care of the reference counts if you use it correctly so you can avoid worrying about it in most cases.

更新:主题 Programming DirectX with COM旧版 DirectX SDK 中的内容现已更新并发布在 Microsoft Docs 上。

关于c++ - 如何/何时在 DirectX 中释放资源和资源 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54000030/

相关文章:

c++ - 是否可以使用任意字符作为运算符?

c++ - 使用 glTextCoordPointer 贴花纹理

c++ - 与DLL混淆。没有 .lib 或 .h

android - 我们如何在 android 中拥有条件资源值?

windows - 以编程方式捕捉到扬声器的声音的最佳向后兼容方式

c++ - 我需要用 Protobuf 存储长度信息吗?

java - 布局 xml 中的资源,但编译器错误为 "not found"

windows - Win32资源文件多重翻译

c++ - 从 IDirect3DSurface9 创建 cv::Mat

shader - 错误X3503 : 'main_Impl' : function return value missing semantics with "d2d1effecthelpers.hlsli"