jjzjj

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

coder 2024-02-07 原文

我在我的 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/

有关c++ - 内存处理(即函数 Release)究竟如何与 Direct3D 一起工作?的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  3. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  4. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  5. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  6. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  7. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  8. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  9. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  10. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

随机推荐