3

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

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

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

不工作。Device.Reset仍然与InvalidCallException. 哦,异常的消息?“申请错误。” 没有帮助。

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

4

1 回答 1

3

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

答案是:场景中s的Dispose方法调用太多了。VertexBuffer原因是内部Device重置处理程序正在调用该Dispose方法。为什么会这样?因为我忽略了阅读有关池枚举的 .NET DirectX SDK 文档,并且VertexBuffer使用 sPool.Default而不是Pool.Managed.

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

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

于 2009-01-19T07:42:34.427 回答