0

System.Windows.Forms.UserControl私のアプリは、エフェクト フレームワークを使用して Direct3d9 レンダリングを行うネイティブ C++ クラスを拡張およびラップする C++/CLI クラスを使用します。ソリューションを VS2010 SP1 から VS2012 にアップグレードするまで、すべてがうまく機能していました。

実稼働マシンでは、アプリは以前よりも少し速く、うまく機能します。しかし、デバッグ時に、次の 2 つのエラーのいずれかがランダムに発生します。

  1. LockRectテクスチャへの呼び出しが永久にブロックされたままになる
  2. C:\Windows\SysWOW64\nvd3dum.dllバージョンでアクセス違反が発生しました9.18.13.3182

Windows 7 Ultimate、64 ビット、すべての最新の更新プログラムを使用しています。デュアルヘッドNvidia GeForce 210 GPU(VGA出力から1つ、DVI-to-VGAアダプターを備えたDVIから1つ)によって供給されるデュアルモニターセットアップを使用しています。

これはグラフィック アダプターの問題のように思われるため、Nvidia ドライバーを最新バージョンにアップグレードすることしか考えられませんでした。これにより、エラーがさらに頻繁になり、開発ボックスがデバッグに使用できなくなりました。私の同僚も同様の環境にあり、この問題はまったく発生していません。

おそらくGPUに物理的な損傷がありますか?どうすればそれを確認できますか?これをトラブルシューティングするための他のヒントはありますか?

4

1 に答える 1

0

ブロックの問題を調査したLockRectところ、Direct3D9 は既定でスレッド セーフではないという主張を多数目にしました。

それは私をクリックしました。最近、テクスチャ データを直接更新する (つまり、ディスパッチしない) ネイティブ コードを並列化しました。そのため、 への同時呼び出しがありましたLockRect。人々はそれPresentは危険な呼び出しだと言いましたが、CreateDevice D3DCREATE_MULTITHREADED動作フラグを設定してみました。ほら、スムーズにデバッグできるようになり、クラッシュやデッドロックはなくなりました。

警告: マルチスレッド フラグを有効にすると、パフォーマンスに大きなオーバーヘッドが生じると言われていますが、私の場合は無視できました (そして、フレーム グラバーからライブ ビデオを実行しています)。

于 2013-12-09T21:16:38.380 に答える