2011-05-26 55 views
2

我正在为direct3d采取的教程说:使用D3D,在退出我的过程之前是否需要调用release?

“...基本上,如果您创建Direct3D,但从不关闭它,它将继续在计算机的后台运行,直到下一次重新启动,即使在程序本身关闭后也是如此,坏的,尤其是如果你的游戏中有很多资源的话,尤其不好,因为释放这两个接口可以让所有的东西都消失,并且允许Windows收回它的内存。 (link

我真的不相信这个教程中所说的话,这些资源仍然会挂你退出程序后...

一样,如果我的程序崩溃或我只需按下停止在调试。这些资源是否仍在徘徊?和其他使用directx的游戏一样,我经常通过杀死这个进程来关闭它们。

如果我退出我的进程并且不要调用设备 - >释放,资源是否可以免费提供给操作系统?

回答

3

简而言之,没有。那是不正确的。当进程终止时,所有DirectX资源都将被释放,并且不会泄漏GPU或系统内存。

1

尽管确实会回收与进程相关的资源(如内存,线程,句柄等),但回想一下D3D也正在利用视频硬件上的内存和资源。根据您的具体实施情况,未通知D3D您正在关闭可以并且将不在流程退出时清除所有这些。

我已经看到一些非常有趣的渲染失真在使用托管DX9界面的软件中出现,该界面无法清理直到调用EvictManagedResources。这些工件出现在自动化测试套件中,是的 - 它们在同一进程的单独调用(显示器/帧缓冲区上的小块垃圾)之间持续存在。

正确编码的应用程序仍然可以对内部异常和/或进程终止请求(WM_QUERYENDSESSION等)做出适当的反应并执行此清理。

+0

清理内存(调零)和将其释放以供进一步使用是有区别的。我怀疑后者在流程退出时没有完成。但是,是的,写入视频内存的东西会在应用程序调用中持续存在,但事实上这些东西都位于下一个应用程序展示的视频内存中,这个内存被重新分配给新的应用程序,因此没有内存泄漏。 – 2011-05-26 16:13:47

+0

“清理”!=“清零记忆”就我而言。你是正确的,进程系统内存被释放,但视频设备资源(内存)不是,这取决于你的[D3DPOOL使用] http://msdn.microsoft.com/en-us/library/bb172584(V = vs.85 ).aspx - 此内存的设备部分与应用程序无关(并且在我的情况下使用了D3DPOOL_MANAGED)。我还会指出,在第一次测试应用程序迭代之后,以及在下一次迭代开始之前(它们持续存在),这些工件在桌面上可见,直到添加了EvictManagedResources为止 – holtavolt 2011-05-26 17:49:13

+0

无论您将D3D资源分配给哪个池,它们将在应用程序终止时自动释放并返回给驱动程序,即使它崩溃。它们不会被清零或覆盖,因此在第二个进程中使用新分配但未初始化的缓冲区仍可能会显示旧内容的一个偏离版本。但即使您在退出之前手动释放第一个进程中的每个资源指针,情况也可能如此。 – Alan 2011-05-27 15:07:52

相关问题