繁体   English   中英

从D3D挂钩释放资源

[英]Releasing resources from D3D hook

我有一个DLL挂钩了另一个应用程序的D3D调用。 特别是,它会创建一些用于渲染的纹理。 但是,当在删除挂钩之前关闭目标应用程序时,有时会导致出现“非零引用计数”错误消息。 显然,这是因为钩子拥有的纹理没有及时释放。

当我通过挂起Reset调用并释放资源来调整窗口大小时,我能够摆脱此错误; 但是,我不确定在实际释放窗口时该怎么做。 我可以钩上Release方法,但是我看不出明确的方法来判断设备实际上是在被销毁还是其引用计数只是减少了。 原始Release调用的返回值告诉我的并不多,因为该钩子的纹理仍在保留对该设备的引用,并且跟踪这些引用似乎工作量太大。

我可以总是总是在调用Release时释放所有纹理,然后在再次需要它们时重新创建它们,但是由于Release钩子可能会由D3D代码中的隐式release调用触发,因此可能会导致过多的开销。 例如,如果主机应用程序创建了一些小资源并在每个帧中释放它,那么这可能会导致钩子丢弃并在每个帧上重新创建所有纹理,这是相当昂贵的。

由于该主题的作者从未回来过,因此我想提供解决问题的方法。 代替挂钩特定功能,实现代理D3D类,该类应保留对真实接口的引用。 销毁后,它将释放接口。 现在解决您的问题,因为您知道真正的接口永远不会在您的类之前发布,所以请从代理Release中调用真正的Release方法,如果引用计数达到1,请释放资源并销毁代理类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM