我在以下代码行中遇到了一个非常烦人的问题:
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);
之后,同步对象才会生成解锁。
我现在的问题 - 如果在VertexBufferBinding
和Draw(..)
之间更改SwapChain.Present(..)
,是否可以引发访问冲突?还是被复制了?
并且,一个 - 为什么我不能捕获这种访问违规?它总是一个“未处理的例外”。
编辑:奇怪的是,访问冲突仅出现在我的工作笔记本(Core i5,Intel HD 3000和Radeon 6490M)上,但不出现在我的家用笔记本电脑上(Core i7,Intel HD 3000和NVidia GeForce 540M) 。
答案 0 :(得分:0)
经过大量测试,它指出这个问题必须由amd动态可切换图形选项引起 - 强制集成或最大图形,不会出现异常,所以可能是amd驱动程序更改了gpu设置应用程序 - 就像文档说的那样,“如果需要更多电源,将动态切换gpu”。所以这不是因为我更新了一些矩阵或顶点,这是因为当这个操作完成时我的程序需要更多的功率(它是一个带有分层几何的一点cad /建模程序 - 当A1更新时,AX到AZ有也要重新计算。)
而且,也许,它不会发生在NVidia系统上,因为gpu没有动态切换 - 它是在应用程序启动时设置的。