我有一个DLL挂钩另一个应用程序的D3D调用。特别是,它创建了一些用于渲染的纹理。但是,在删除钩子之前关闭目标应用程序时,有时会出现“非零引用计数”错误消息。显然这是因为钩子所拥有的纹理没有及时释放。
通过挂钩Reset
调用并释放资源,我可以在调整窗口大小等时消除此错误;但是,我不确定当窗口实际发布时该怎么办。我可以挂钩Release
方法,但是我没有明确的方法来判断设备是否实际被销毁或者其引用计数是否只是递减。原始Release
调用的返回值并没有告诉我太多,因为钩子的纹理仍然保持对设备的引用,并且跟踪这些引用似乎太多了。
我可以在调用Release
时简单地释放所有纹理,然后在我再次需要它时重新创建,但由于Release
挂钩可能会被隐式释放调用触发在D3D代码中,这可能会导致过多的开销。例如。如果主机应用程序创建了一些小资源并在每一帧中释放它,这可能导致钩子丢弃并在每一帧上重新创建所有纹理,这相当昂贵。
答案 0 :(得分:0)
由于该主题的作者从未回到这里,我想提供我的解决方案。而不是挂钩特定的函数,实现一个代理D3D类,它应该保持对真实接口的引用。在销毁时,它会释放界面。现在要解决您的问题,因为您知道真正的接口永远不会在您的类之前发布,请从您的代理版本中调用真正的Release方法,如果引用计数达到1,则释放您的资源并销毁代理类。