SlimDX Device.Reset崩溃,出现“D3DERR_INVALIDCALL:无效呼叫(-2005530516)”错误

我们最近从VS 2005升级到VS 2008 (Windows XP)。 我们在其中一个项目中使用SlimDx 。 升级后一切正常,除了我的恢复function,它会在devicelost / device reset上调用

D3DERR_INVALIDCALL:无效通话(-2005530516)

我使用CtrlAltDel然后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很好地配合使用?

我在这个论坛post中找到了一些有用的信息。 请注意该论坛上与VB相关的问题,但这仍然是一个很好的信息。 完全归功于Simon O’Connor 。

重新格式化并略微编辑。

INVALIDCALL通常意味着您传递给D3D的参数无效或您无法执行的操作。

找出D3D调用返回INVALIDCALL错误的原因的最简单方法是让它告诉您:

  1. 确保您正在使用安装了D3D运行时的DEBUG版本(安装SDK时您已获得选项)。
  2. 确保已启用运行时的DEBUG版本。 转到控制面板中的DirectX小程序,然后在Direct3D选项卡下查看。
  3. 在DirectX控制面板小程序中,将Direct3D的调试输出级别提高到最大值。 我已经使用Visual BASIC超过10年了,所以我忘记了可用的调试支持,我没有在这台机器上安装它来检查…如果VB有一个调试输出窗口:
  4. 运行程序并使其失败并显示INVALIDCALL错误。
  5. 现在查看调试输出窗口中的所有文本。 D3D将记录信息,警告以及重要的错误。 它还解释了为什么D3D呼叫失败的原因。

如果VB没有简单的调试输出窗口,请从http://www.sysinternals.com下载并运行DebugView,或使用DirectX SDK附带的命令行调试查看器

当您没有处理所有资源(顶点缓冲区,纹理……)时,通常会发生这种情况。

 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) {} }