2014-02-17 40 views
0

我有一個掛鉤其他應用程序的D3D調用的DLL。特別是,它創建了一些用於渲染的紋理。但是,當目標應用程序在掛鉤被移除之前關閉時,它有時會導致出現「非零引用計數」錯誤消息。顯然這是因爲鉤子擁有的紋理沒有及時發佈。從D3D掛鉤釋放資源

我可以通過掛接Reset調用和釋放資源來調整窗口大小等時擺脫此錯誤;不過,我不確定該窗口實際發佈時該怎麼做。我可以掛鉤Release方法,但是我沒有看到清楚的方式來告訴設備是否實際上被銷燬或者它的引用計數是簡單遞減的。原始Release調用的返回值並沒有多大的意義,因爲鉤子的紋理仍然保存對設備的引用,並且跟蹤這些引用看起來像是太多工作。

當我調用Release時,我總是可以釋放所有紋理,然後在我再次需要時重新創建,但由於Release鉤子可能會由D3D代碼中的隱式釋放調用觸發,因此可能會造成太多開銷。例如。如果主機應用程序創建一些小資源並在每個幀中釋放它,這可能會導致掛鉤丟棄並重新創建每個幀的所有紋理,這相當昂貴。

回答

0

由於該主題的作者從未回到這裏,所以我想提供我的解決方案。而不是掛鉤特定的功能,實現一個代理D3D類應該保持對真實接口的引用。在銷燬時,它釋放界面。現在要解決您的問題,因爲您知道真正的界面永遠不會在您的課堂上發佈,所以如果引用計數達到1,請從您的代理版本中調用真正的Release方法,釋放資源並銷燬代理類。