首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DirectX11资源释放多线程

DirectX11资源释放多线程
EN

Stack Overflow用户
提问于 2018-11-14 04:54:24
回答 1查看 499关注 0票数 0

我读过https://docs.microsoft.com/en-us/windows/desktop/direct3d11/overviews-direct3d-11-render-multi-thread-intro

它声明我可以从多个线程调用ID3D11Device (除非使用了D3D11_CREATE_DEVICE_SINGLETHREADED ),但对ID3D11DeviceContext的调用必须用临界区括起来。

我还没有找到任何关于释放资源的信息,使用他们的'Release‘方法,比如纹理,渲染目标,顶点/索引缓冲区,着色器。

ID3D11Texture2D、ID3D11Texture3D、ID3D11ShaderResourceView、ID3D11RenderTargetView、ID3D11DepthStencilView

ID3D11Buffer。

ID3D11VertexShader、ID3D11HullShader、ID3D11DomainShader、ID3D11PixelShader。

1)当渲染线程的ID3D11DeviceContext不使用这些资源时,我是否可以在任何时候从任何线程调用这些资源的'Release‘,而不使用临界区?

2)我是否可以从其他线程调用这些资源的'Release‘,即使这些资源正在被渲染线程中的ID3D11DeviceContext使用?

或者,我是否需要使用用于访问ID3D11DeviceContext的相同关键部分来包含发布调用?

EN

回答 1

Stack Overflow用户

发布于 2018-11-14 08:58:39

通常,COM引用计数的内部实现是以线程安全的方式完成的(原子递增/递减),因此从多个线程调用AddRefRelease是安全的。

当然,如果refcount为0,那么你就有一个对象销毁,所以如果你有多个线程使用相同的资源,那么有适当数量的引用计数来保持它的活动是很重要的。在Direct3D中,对象销毁通常是延迟销毁,因此实际的对象清理可能在几个帧内不会发生,但如果有人引用它,您仍然应该保留一个非零的引用计数。

Direct3D 11使用与Direct3D 10相同的规则。它对流水线设置方法使用“弱引用”,因此仅在设备上下文上设置资源不足以增加其引用计数。IOW:如果你有两个线程都使用相同的资源渲染,那么每个线程都必须在对象上持有一个引用计数,以保持它的“活动”,无论它在任何给定的时刻是否在设备上下文中被“主动设置”。

它以这种方式工作,以避免不断增加/减少每个渲染帧的引用计数的开销。在Direct3D 9中,这种情况在一帧或更多帧中发生了数千次。

此外,如果ID3D11Device达到零引用计数,它和它的所有子对象都会被释放,而不管单个设备子引用计数如何。

参见Microsoft Docs

最好的答案是使用像Microsoft::WRL::ComPtr这样的智能指针,并让使用给定资源的每个线程都有自己的ComPtr指向该资源。这样一来,唯一真正特殊的情况就是设备拆卸时(例如响应DXGI_ERROR_DEVICE_REMOVED或执行“干净退出”)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53289350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档