在SwapChain.Present上访问冲突

时间:2012-11-19 14:03:05

标签: c# sharpdx

我在以下代码行中遇到了一个非常烦人的问题:

try{
  mSwapChain.Present(0, PresentFlags.None);    //AccessViolationException, caught by debugger
}catch(Exception Ex){
  throw Ex;  //Debugstop here, but not reached
}

//DeviceContext: SharpDX.Direct3D11.DeviceContext
//mVertexBinding: SharpDX.Direct3D11.VertexBufferBinding

DeviceContext.InputAssembler.SetVertexBuffers(0, mVertexBinding);
DeviceContext.Draw(mNumVertices, 0);

我的程序运行一个计时器,它会引发一个事件,如果它被引发并且我此时没有渲染,程序会强制执行rendercall。同时运行另一个计时器+鼠标事件,更新矩阵,顶点,缓冲区和填充 - 但是在渲染时,所有这些更新函数都被锁定 - 但只有在达到DeviceContext.Draw(mNumVertices, 0);之后,同步对象才会生成解锁。

我现在的问题 - 如果在VertexBufferBindingDraw(..)之间更改SwapChain.Present(..),是否可以引发访问冲突?还是被复制了? 并且,一个 - 为什么我不能捕获这种访问违规?它总是一个“未处理的例外”。

编辑:奇怪的是,访问冲突仅出现在我的工作笔记本(Core i5,Intel HD 3000和Radeon 6490M)上,但不出现在我的家用笔记本电脑上(Core i7,Intel HD 3000和NVidia GeForce 540M) 。

1 个答案:

答案 0 :(得分:0)

经过大量测试,它指出这个问题必须由amd动态可切换图形选项引起 - 强制集成或最大图形,不会出现异常,所以可能是amd驱动程序更改了gpu设置应用程序 - 就像文档说的那样,“如果需要更多电源,将动态切换gpu”。所以这不是因为我更新了一些矩阵或顶点,这是因为当这个操作完成时我的程序需要更多的功率(它是一个带有分层几何的一点cad /建模程序 - 当A1更新时,AX到AZ有也要重新计算。)

而且,也许,它不会发生在NVidia系统上,因为gpu没有动态切换 - 它是在应用程序启动时设置的。