Direct3D使用引用计数(通过 AddRef 和 Release )控制对象生命周期的方法,有一些特定的怪癖,因为它不遵循通用组件对象模型的所有规则( COM )。
AddRef
Release
具体来说,如果 只要 对象的引用是指如果你在设备上下文中设置它(a.k.a.将它绑定到渲染管道),这还不足以使它保持活动状态,因为这些方法不会增加/减少引用计数。看到 Microsoft Docs 。因此,您的程序需要保留其当前使用的Direct3D对象的其他引用。
另一个区别是如果 ID3D11Device 因为它的引用计数达到零而被销毁,所以引用计数对于它的所有内容都无关紧要 ID3D11DeviceChild 那些对象和那些都是无效的。
ID3D11Device
ID3D11DeviceChild
您还应该记住,Direct3D对象实际上不会被销毁,直到将来某个点(例如它使用延迟破坏),因此即使引用计数为零,它也可能需要几帧才能完全清理。如果您正在处理大量活动资源并且不得不担心过度提交,这一点非常重要 - 除此之外,您可以通过使用强制完成挂起的破坏 ID3D11DeviceContext::Flush ,但经常这样做不是一个好的做法。
ID3D11DeviceContext::Flush
的 TL; DR: 强> 该 ID3D11ShaderResourceView object为引用添加了引用计数 ID3D11Resource 对象,因此只要SRV处于活动状态,资源也会保持活动状态。你只需要取一个返回对象 CreateWICTextureFromFile ,但你可以随心所欲。见 维基 有关详细信息,请参阅WICTextureLoader模块的页面。
ID3D11ShaderResourceView
ID3D11Resource
CreateWICTextureFromFile
这是学习使用的好理由 ComPtr 智能指针。如果您正确使用它,它会处理引用计数,因此在大多数情况下您可以避免担心它。