Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对于D3D,我是否需要在退出流程之前调用release?_C++_C_Direct3d_Direct3d9 - Fatal编程技术网

C++ 对于D3D,我是否需要在退出流程之前调用release?

C++ 对于D3D,我是否需要在退出流程之前调用release?,c++,c,direct3d,direct3d9,C++,C,Direct3d,Direct3d9,我正在为direct3d学习的教程中说: "... 基本上,如果您创建Direct3D,但从未关闭它,它将在计算机后台继续运行,直到下次重新启动,即使程序本身关闭。糟糕。如果你在游戏中有很多资源,那就更糟糕了。释放这两个界面可以让一切都脱离困境,并允许Windows收回内存。”() 我真的不相信本教程所说的,在您退出流程后,资源仍然会挂起 比如,如果我的程序崩溃了,或者我在调试时简单地按了停止键..这些资源还在吗?以及其他使用directx的游戏,我经常通过终止进程来关闭它们 如果我退出进程,不

我正在为direct3d学习的教程中说:

"... 基本上,如果您创建Direct3D,但从未关闭它,它将在计算机后台继续运行,直到下次重新启动,即使程序本身关闭。糟糕。如果你在游戏中有很多资源,那就更糟糕了。释放这两个界面可以让一切都脱离困境,并允许Windows收回内存。”()

我真的不相信本教程所说的,在您退出流程后,资源仍然会挂起

比如,如果我的程序崩溃了,或者我在调试时简单地按了停止键..这些资源还在吗?以及其他使用directx的游戏,我经常通过终止进程来关闭它们


如果我退出进程,不调用device->Release,这些资源是否可以释放到操作系统?

简单地说,不是这样。当进程终止时,所有DirectX资源都将被释放,GPU或系统内存都不会泄漏。

而进程相关的资源,如内存、线程、句柄等,确实是这样s、 等将被回收,回想一下,D3D也在利用视频硬件上的内存和资源。根据您的具体实现,如果不通知D3D您正在关闭,则在进程退出时可能也不会清除所有这些

我看到一些非常有趣的渲染工件出现在使用托管DX9接口的软件中,在调用之前无法清理。这些工件出现在自动测试套件中,是的-它们在同一进程的不同调用之间持续存在(如显示/帧缓冲区上的小矩形垃圾)


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

清理内存(归零)与清除内存之间存在差异我怀疑当进程退出时,后一种情况不会发生。但是,是的,写入视频内存的内容会在应用程序调用过程中持续存在,但这些内容随后会位于下一个应用程序的视频内存中这一事实表明,此内存会重新分配给新的应用程序,因此没有内存泄漏。就我而言,“清理”!=“归零内存”。进程系统内存被释放是正确的,但视频设备资源(内存)没有被释放,这取决于您的[D3DPOOL用法]——此内存的设备部分与应用程序没有关联(在我的案例中使用了D3DPOOL\u管理)。我还将指出,在第一次测试应用程序迭代之后和下一次迭代开始之前,工件在桌面上是可见的(它们持续存在),直到RejectManagedResources被添加到您分配D3D资源的池中,当您的应用程序终止时,即使它崩溃,它们也会被自动释放并返回到驱动程序。它们不会被置零或覆盖,因此在第二个进程中使用新分配但未初始化的缓冲区可能仍然会显示旧内容的分布式版本。但即使您在退出前手动释放第一个进程中的每个资源指针,也可能会出现这种情况。同样,我观察到的显示工件在第一个进程终止后一直存在,并在后续调用的整个运行过程中始终存在,因此很明显应用程序已损坏。”驱动程序内存“超出了应用程序的范围,直到我添加了显式的ReceiveManagedResources调用。也就是说,我已经阅读了更多的指导原则[并看到退出时不需要ReceiveManagedResources。可能是其他地方发生了损坏,或者这只是托管DirectX 9中的一个bug。