0

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

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);

我的程序运行一个引发事件的计时器,如果它被引发并且我此时没有渲染,则程序会强制执行渲染调用。同时运行另一个计时器 + 鼠标事件,更新矩阵、顶点、缓冲区和其他东西 - 但在渲染时,所有这些更新功能都被锁定 - 但只有在DeviceContext.Draw(mNumVertices, 0);达到之前,同步对象才会解锁。

我现在的问题 - 如果在和VertexBufferBinding之间更改,是否会引发访问冲突?还是抄袭?而且,第二个 - 为什么我不能捕捉到这种访问冲突?它总是一个“未处理的异常”。Draw(..)SwapChain.Present(..)

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

4

1 回答 1

1

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

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

于 2012-11-19T15:29:08.810 回答