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

私のプログラムはイベントを発生させるタイマーを実行します。イベントが発生し、この時点でレンダリングしていない場合、プログラムはrendercallを強制します。別のタイマーとマウスイベントを同時に実行し、行列、頂点、バッファなどを更新しますが、レンダリング中は、これらの更新関数はすべてロックされますがDeviceContext.Draw(mNumVertices, 0);、到達するまでは、同期オブジェクトのロックが解除されます。

VertexBufferBinding今の私の質問-との間で変更された場合、アクセス違反が発生する可能性がDraw(..)ありSwapChain.Present(..)ますか?それともコピーされますか?そして、2番目の1つ-なぜこのアクセス違反をキャッチできないのですか?これは常に「未処理の例外」です。

編集:奇妙なことに、アクセス違反は私のWork Notebook(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に再計算する必要もあります)。

また、GPUは動的に切り替えられないため、NVidiaシステムでは発生しない可能性があります。これは、アプリケーションの起動時に設定されます。

于 2012-11-19T15:29:08.810 に答える