gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:36:44 25 4
gpt4 key购买 nike

我一直在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com