gpt4 book ai didi

c++ - 内存处理(即函数 Release)究竟如何与 Direct3D 一起工作?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:58:31 27 4
gpt4 key购买 nike

我在我的 Direct3D 应用程序中遇到了一个泄漏,我最终纠正了它,但我认为泄漏的原因是由于我对 Direct3D 处理其内存和接口(interface)的方式的误解。

我无法找到关于它的权威文章/教程(如果有请提供),但根据我收集到的信息,它是这样工作的:

  • 每次调用Get 方法时,返回对象的引用数都会增加。因此,如果我调用 GetRenderTarget,被渲染到的表面的引用计数会增加。
  • 在接口(interface)上调用Release 会减少其引用计数。前两点结合起来本质上意味着:每次获得接口(interface)时,用完后释放它。
  • 当引用计数达到 0 时,实例将被删除。

我不完全确定这是否正确,但它似乎在实践中有效。如果有人可以澄清/确认它是如何工作的,那就太好了。

P.S,在发布接口(interface)的时候有什么保障措施吗?在后台缓冲区上多次调用 Release 似乎不会造成任何损害(这是一件好事,但我不确定为什么没有)。

最佳答案

Direct3D 基于 COM,这是一项至少有 15 年历史的技术。似乎很多人声称 COM 已死,因此许多人忽视了它,但现实是 Windows 中有很多东西,包括 Direct3D 和 MS 的新媒体基础,都是基于 COM 的。

我强烈建议您看一下一般的 COM 编程。有很多书籍和资源,但其中很多都相当陈旧,但没关系,因为技术的根源已经很长时间没有改变了。

基本上您观察到的是接口(interface)引用计数。 COM 完全基于通过接口(interface)访问对象,这些接口(interface)都派生自基本接口(interface) IUnknown。 IUnknown 实现了 AddRef() 和 Release() 方法,您的应用程序有责任在您存储指针的本地拷贝时调用 AddRef() 并在不再需要该本地拷贝时调用 Release()。

当你有带有接口(interface)输出参数的方法时(即 IFoo** ppObj ),这意味着被调用者正在给你返回一个接口(interface),现在你有了它,你仍然有责任在你完成时调用 Release()与它。

一旦掌握了窍门,我建议您开始使用 CComPtr 智能类来存储局部变量和成员变量(仍然在函数调用之间传递原始接口(interface)值,不需要智能指针参数类型)。它将处理您所有的引用计数。也不要习惯于多次调用 release。它今天可能会起作用,因为该对象被实现为单例,或者可能有其他东西保留它,但这可能会随着下一个补丁或下一个版本而改变。始终遵守规则。如果你有一个接口(interface),当你不需要它时只调用一次 Release() 。如果您制作了接口(interface)指针的拷贝,请确保只调用一次 AddRef()。

关于c++ - 内存处理(即函数 Release)究竟如何与 Direct3D 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6006991/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com