2011-05-26 100 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

相關問題