我们最近从VS 2005
升级到VS 2008
(Windows XP)。我们在其中一个项目中使用SlimDx
。升级后一切正常,除了我的恢复功能,该功能在devicelost /设备重置时调用,与
D3DERR_INVALIDCALL:无效通话(-2005530516)
我使用 Ctrl - Alt - Del 然后 Escape 来模拟设备丢失。
void Recover()
{
try
{
if (res.Code == D3DERR_DEVICENOTRESET)
{
res = m_device.Reset(m_presentParams); //Crashes on this.
if (res.IsSuccess)
{
m_deviceLost = false;
}
}
}
catch(Exception e)
{}
}
这是否与VS 2008
有关,因为它曾与VS 2005
很好地配合使用?
答案 0 :(得分:8)
我在this forum post中找到了一些有用的信息。请注意该论坛上与VB相关的问题,但这仍然是一个很好的信息。完全归功于Simon O'Connor。
重新格式化并稍加编辑。
INVALIDCALL通常表示您传递给D3D的参数无效或您无法执行的操作。
找出D3D调用返回INVALIDCALL错误的原因的最简单方法是让它告诉您:
- 确保您正在使用安装了D3D运行时的DEBUG版本(安装SDK时您已获得选项)。
- 确保已启用运行时的DEBUG版本。转到控制面板中的DirectX小程序,然后查看Direct3D选项卡。
- 在DirectX控制面板小程序中,将Direct3D的调试输出级别提高到最大值。 我已经没有使用Visual BASIC超过10年,所以我忘记了可用的调试支持,我没有在这台机器上安装它来检查...如果VB有一个调试输出窗口:
- 运行程序并使其失败并显示INVALIDCALL错误。
- 现在查看调试输出窗口中的所有文本。 D3D将记录信息,警告以及重要的错误。它还解释了为什么D3D呼叫失败的原因。
醇>如果VB没有简单的调试输出窗口,请从http://www.sysinternals.com下载并运行DebugView,或使用DirectX SDK附带的命令行调试查看器
答案 1 :(得分:1)
这通常发生在你没有处理所有资源(顶点缓冲区,纹理......)
时答案 2 :(得分:0)
void Recover()
{
try {
if (res.Code == D3DERR_DEVICENOTRESET)
{
res = m_device.Reset(m_presentParams); //Crashes on this.
if (res.IsSuccess)
{
m_deviceLost = false;
}
}
} catch(Exception e) {}
}