idirect3dvertexbuffer9 ::ロック障害の可能性のある原因は何ですか?

StackOverflow https://stackoverflow.com/questions/2771321

  •  03-10-2019
  •  | 
  •  

質問

一部のエラーレポートでは、次の動作をよく見たことがあります:Idirect3DvertExbuffer9 ::ロック障害、返されたエラーコードはD3DERR_NOTAVAILABLEです。

これが発生すると、かなり頻繁に(常にではありませんが)続いて、createTextureまたはcreateertexbufferがエラーd3derr_outofvideomemoryで失敗します。

頂点バッファロック障害の理由は何ですか?仮想メモリアドレス空間は疲れている可能性がありますか、それとも何ですか?

役に立ちましたか?

解決

MicrosoftのChuck WalbournによるDirectXDevの応答に基づいて、「住所のないスペース」に加えて、別の原因は「ページから外れている」可能性があります。

あるいは、Windows XPでは、ページプールカーネルメモリの限界に達したことを示している可能性があります。通常、これは多くのDirect3Dリソース(テクスチャなど)を作成すると発生します。

多くのDirect3Dリソースを作成しています。

他のヒント

これは私がDirectXDevに投稿したものです:;)

アプリケーションが使用しているメモリの量を確認しましたか? (タスクマネージャーの仮想メモリ列を必ず選択してください!)。私の推測は、あなたが提案するように、あなたがアドレス空間を使い果たすことを引き起こすメモリの断片化に基づいた問題です。

しかし、それはドライバーのバグかもしれません...

デバッグランタイムは有用な情報を提供しますか?

編集:私が考えることができる他の唯一のことは、絞りメモリが使い果たしたことです。これがPCIexpressでどのように機能するかはわかりませんが、AGPでは、絞りサイズを設定できます。しかし、それがいっぱいかどうかを確認する方法がわかりません。あなたが見ているエラーは、その完全なことを報告していると思われます。破棄フラグでたくさんのロックをしていますか?もしそうなら、これらが開口部にたくさんの新しい割り当てを作成している可能性があり、そこで記憶を使い果たしてしまいます。ただし、これは純粋な推測作業です。

私は 推測してみて これがあなたのユーザーの一部のみで起こっている場合、それはローエンドマシンのユーザーのものであることです。物事がゆっくりと実行されれば、コマンドバッファーで多くのデータバッファリングを行うことができます。これにより、コントロールが遅れて「できます」と推測して、あなたが見ている問題につながります。コマンドバッファーが長くなりすぎないようにしてみてください。すべてのフレームの最初のロックが破棄フラグなしで実行されていることを確認すると(つまり、フラグが0に設定されています)、これにより、頂点バッファーがレンダリングされ、コマンドバッファーを同期させるまでパイプラインが失速します。これにより、コマンドバッファリングがフレームレートスパイクを簡単にスムーズにすることができないため、これは遅くなります...

とにかく...それはただの推測です!

メモリの不足に関する問題の提起は有効です。確かにロック()呼び出しの詳細が必要です、 しかし たとえば、それがデフォルトのプールにあり、それが動的(D3DLOCK_DISCARDフラグが通過した)の場合、ドライバーが未使用のメモリを見つけようとしようとすることは非常によく可能です(それは内部でダブルまたはトリプルバッファーがバッファまたはトリプルバッファをあなたはすぐに自分自身を発見し、ビデオのメモリは使い果たされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top