2012-11-19 24 views
0

我在下面的代码行有一个很烦人的问题:访问冲突在SwapChain.Present

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);,在这之后,同步对象被解锁。

我现在的问题 - 如果VertexBufferBindingDraw(..)SwapChain.Present(..)之间变化,是否可以提高访问冲突?还是被复制? 而且,secound之一 - 为什么我不能捕获此访问冲突?它总是一个“未处理的异常”。

编辑:奇怪的是,该访问冲突只出现在我的工作笔记本电脑(酷睿i5,英特尔HD 3000 &的Radeon 6490M),但不是我的家用笔记本电脑(酷睿i7,英特尔HD 3000 &的NVIDIA GeForce 540M)。

+0

望着SwapChain.Present的文档:http://msdn.microsoft.com/en-us/library/windows/desktop/bb153037(v=vs.85).aspx它看起来像这个功能并不会抛出一个AccessViolationException,所以问题来自我假设的其他地方。 –

+0

什么是访问冲突的调用堆栈? – jeroenh

+0

赫姆..你是对的。我已经搜查在sharpdx代码,但我认为它的自动生成的功能..我没有得到调用堆栈上的任何信息,因为它是“外部代码” .. 。更多的测试表明我来说,这大多出现访问冲突,如果相机/对象的矩阵,经常会.. – lunatix

回答

0

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

而且,也许,它碰巧不使用了nVidia系统,因为GPU并不是动态切换 - 它被设置在应用程序启动时间。