我一直在使用 C# 开发 DirectX 应用程序,我注意到当我锁定工作站时,DirectX“设备”会丢失。在查找了有关设备丢失时如何处理(以及 Device.Present
抛出 DeviceLostException
时)的信息后,我重新编写了重置代码设备
。这只是意味着我调用了 Device.Reset
。
调用 Device.Reset
恢复了 Device
。没问题。但是当我第二次丢失设备时(例如,当计算机被锁定、进入休眠状态或激活屏幕保护程序时),Device.Reset
抛出异常。
异常是 InvalidCallException
,这(根据文档)意味着调用出现了问题。所以我认为这是函数参数的问题。因此,我没有传递用于创 build 备的相同 PresentParams
副本,而是创建了一个 PresentParams 的新实例(首先使用复制构造函数,后来在没有它的情况下重新创建)并传递Device.Reset
。
不起作用。 Device.Reset
仍然死于 InvalidCallException
。哦,还有异常消息? “应用程序错误。”没有帮助。
您能否为我指明解决方案的方向,或一些有关如何从 DirectX 获取更多调试信息的文档?
最佳答案
好吧,我知道回答我自己的问题似乎很愚蠢,但我想其他人可能需要这个,嗯?
答案是:场景中对VertexBuffer
的Dispose
方法的调用过多。原因是内部 Device
重置处理程序正在调用 Dispose
方法。为什么会这样?因为我忘记阅读有关池枚举的 .NET DirectX SDK 文档,并且使用 Pool.Default
而不是 Pool.Managed< 分配
.VertexBuffer
/
很明显,在几千次糟糕的分配和释放周期之后,出现了问题。
哦,我是怎么发现这个的?我将一个监听器附加到 VertexBuffer.Dispose
,它增加了我在屏幕上显示的计数器。想象一下,当我注意到这个计数器在我调整窗口大小时不断增长时,我是多么惊讶!
关于c# - 第二次调用 DirectX 中的 Device.Reset 会抛出 InvalidCallException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/438347/