c# - 第二次调用 DirectX 中的 Device.Reset 会抛出 InvalidCallException

标签 c# .net directx

我一直在使用 C# 开发 DirectX 应用程序,我注意到当我锁定工作站时,DirectX“设备”会丢失。在查找了有关设备丢失时如何处理(以及 Device.Present 抛出 DeviceLostException 时)的信息后,我重新编写了重置代码设备。这只是意味着我调用了 Device.Reset

调用 Device.Reset 恢复了 Device。没问题。但是当我第二次丢失设备时(例如,当计算机被锁定、进入休眠状态或激活屏幕保护程序时),Device.Reset 抛出异常。

异常是 InvalidCallException,这(根据文档)意味着调用出现了问题。所以我认为这是函数参数的问题。因此,我没有传递用于创 build 备的相同 PresentParams 副本,而是创建了一个 PresentParams 的新实例(首先使用复制构造函数,后来在没有它的情况下重新创建)并传递Device.Reset

不起作用。 Device.Reset 仍然死于 InvalidCallException。哦,还有异常消息? “应用程序错误。”没有帮助。

您能否为我指明解决方案的方向,或一些有关如何从 DirectX 获取更多调试信息的文档?

最佳答案

好吧,我知道回答我自己的问题似乎很愚蠢,但我想其他人可能需要这个,嗯?

答案是:场景中对VertexBufferDispose 方法的调用过多。原因是内部 Device 重置处理程序正在调用 Dispose 方法。为什么会这样?因为我忘记阅读有关池枚举的 .NET DirectX SDK 文档,并且使用 Pool.Default 而不是 Pool.Managed< 分配 VertexBuffer/.

很明显,在几千次糟糕的分配和释放周期之后,出现了问题。

哦,我是怎么发现这个的?我将一个监听器附加到 VertexBuffer.Dispose,它增加了我在屏幕上显示的计数器。想象一下,当我注意到这个计数器在我调整窗口大小时不断增长时,我是多么惊讶!

关于c# - 第二次调用 DirectX 中的 Device.Reset 会抛出 InvalidCallException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/438347/

相关文章:

.net - 从字符串验证 Uri

c# - .NET 空闲内存使用(如何防止过度分配/释放内存给操作系统)

c++ - DirectX::XMMATRIX 错误 C2719: __declspec(align ('16' )) 不会对齐

c++ - Direct3D11(C++) : Updating Texture coordinates in constant buffer?

c# - 向以编程方式创建的控件添加工具提示

代码隐藏语法中的 javascript

c# - Autofac:如何加载引用但未直接使用的程序集

c# - 使用 Microsoft.DirectX.AudioVideoPlayback 播放视频时出错;汇编版本错误

c# - 动态定义SSRS报表的DataSet和DataSource

c# - 禁用 Windows 窗体 Web 浏览器中的提示