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

时间:2010-03-23 04:47:23

标签: c# .net directx slimdx

我们最近从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很好地配合使用?

3 个答案:

答案 0 :(得分:8)

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

重新格式化并稍加编辑。

  

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

     

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

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

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