对于D3D,在退出进程之前是否需要调用release
With D3D, do I need to call release before I exit my process?
我为direct3d学习的教程是这样说的:
"…基本上,如果你创建了Direct3D,但从未关闭它,它只会在计算机的后台继续运行,直到你下次重新启动,即使程序本身关闭。糟糕。尤其糟糕的是,如果你的游戏中有很多资源。释放这两个界面可以让一切摆脱困境,并允许Windows收回它的内存。"(链接)
我真的不相信这个教程所说的,在你退出这个过程后,资源仍然会挂在那里。。。
比如,如果我的程序崩溃,或者我只是在调试时按下停止键。。资源还在吗?和其他使用directx的游戏,我经常通过杀死过程来关闭它们。
如果我退出进程并且不调用设备->Release,那么资源会对操作系统免费吗?
简单地说,不是。当进程终止时,所有DirectX资源将被释放,GPU或系统内存不会泄漏。
虽然确实会回收与进程相关的资源,如内存、线程、句柄等,但请记住,D3D也在利用视频硬件上的内存和资源。根据您的具体实现,如果不通知D3D您正在关闭,可能也不会在进程退出时清除所有这些。
我在使用Managed DX9接口的软件中看到了一些非常有趣的渲染工件,这些工件在调用EvictManagedResources之前无法清理。这些工件发生在一个自动化的测试套件中,是的,它们在同一进程的单独调用之间持续存在(作为显示/帧缓冲区上的小矩形垃圾)。
正确编码的应用程序仍然可以对内部异常和/或处理终止请求(WM_QUERYENDESSION等)做出适当反应,并执行此清理。
相关文章:
- 如何检查在编译时是否调用了模板化方法?
- 通过引用传递对象时是否调用复制构造函数?
- 如何在类中检查是否调用宏
- 传递类 by-value 时,调用方或被调用方是否调用析构函数
- 如何检查是否调用了成员方法
- c++ 运算符 new[]/delete [] 是否调用运算符 new/delete?
- Lvalue和Literal之间的比较是否调用Lvalue到Rvalue的转换
- 编译器如何知道是否调用 const 重载
- stl 优先级队列中的堆管理是否调用复制构造函数
- 此代码是否调用不存在的构造函数?
- 以下 C/C++ 代码是否调用未定义的行为
- Type t=Type()是否调用复制构造函数
- 检查是否调用了复制构造函数
- 以下代码是否调用未定义的行为
- std:map 析构函数是否调用键析构函数以及值析构函数?
- 当我在extern c中创建对象时,是否调用了c++类析构函数
- vector是否调用指向对象的指针的析构函数
- ToUnicode是否调用ToUnicodeEx?ToUnicodeEx在内核空间线程上更改了什么
- 如何在编译时检查是否调用了函数
- unique_ptr::release()是否调用析构函数