c#-DirectX中对Device.Reset的第二次调用引发InvalidCallException
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-DirectX中对Device.Reset的第二次调用引发InvalidCallException,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1303字,纯文字阅读大概需要2分钟。
内容图文
我一直在使用C#开发DirectX应用程序,但我发现锁定工作站时,DirectX“设备”丢失了.在查找了有关设备丢失(以及Device.Present抛出DeviceLostException)时应采取的措施的信息之后,我重新编写了代码以重置设备.这只是意味着我调用了Device.Reset.
调用Device.Reset恢复设备.没问题.但是,当我第二次丢失设备时(例如,当计算机被锁定,进入睡眠状态或激活了屏幕保护程序时),Device.Reset引发了异常.
异常是InvalidCallException,(根据文档)这意味着调用出错.因此,我认为该函数的参数存在问题.因此,我没有传递与我用来创建Device的PresentParams相同的副本,而是创建了一个PresentParams的新实例(首先使用副本构造函数,然后通过不使用它的重新创建)并将其传递给Device.Reset.
不起作用Device.Reset仍然死于InvalidCallException.哦,还有异常消息吗? “应用程序错误.”没有帮助.
您能否指出我的解决方案或有关如何从DirectX中获取更多调试信息的文档的方向?
解决方法:
好吧,我知道回答自己的问题似乎很愚蠢,但我认为其他人可能需要这个,是吗?
答案是:场景中对VertexBuffers的Dispose方法的调用过多.原因是内部设备的重置处理程序正在调用Dispose方法.为什么会这样呢?因为我忽略了有关池枚举的.NET DirectX SDK文档,所以我使用Pool.Default而不是Pool.Managed来分配VertexBuffers.
显然,经过数千次分配和释放循环的失败之后,出现了问题.
哦,我是怎么发现的?我在VertexBuffer.Dispose上附加了一个侦听器,该计数器增加了我在屏幕上显示的计数器.想象一下,当我注意到调整窗口大小时计数器不断增长时,我感到惊讶!
内容总结
以上是互联网集市为您收集整理的c#-DirectX中对Device.Reset的第二次调用引发InvalidCallException全部内容,希望文章能够帮你解决c#-DirectX中对Device.Reset的第二次调用引发InvalidCallException所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。