2

私はdirect3dを使用してyuvビデオデータをレンダリングしています。基本的なプロセスは次のとおりです。

このサーフェスでCreateOffscreenPlainlockrectangleを使用してyv12サーフェスを作成し、データポインターを取得し、yuvデータをコピーします。このサーフェスからバックバッファ呼び出しが存在するまでのstretchrectangleは、バックバッファを表示します。

LockRectangle呼び出しには、LockFlagsパラメーターがあり、LockFlags.Discardを使用しています。これは、バッファー全体を上書きすることを意味しているように聞こえます。

これにより、一部のIntelオンボードグラフィックスデバイスでいくつかの問題(現在の例外)が発生するようですが、LockFlagsをLockFlags.Noneに変更すると、問題は解決するようです。これを行うことで競合状態を作成しましたか?

ここでロックの必要性を理解する必要があると思います。表示は32ビットのrgbであるため、yuvからrgbへの変換はstretchrectangle呼び出しで行われると思います。このプロセスは同期または非同期であると想定されていますか?現在は非同期であることを読んだと思いますが、それは私が直接触れないバックバッファーの操作であるため、私には関係ありません。

質問が意味をなさない場合はお詫び申し上げます。これまでのところ、これをうまく処理できていないと思います。

4

1 に答える 1

0

D3D9を使用していると思いますか?いずれにしても、すべての API で同じです。

「D3DLOCK_DISCARD」を使用する場合は、常にバッファ内のすべてのデータを書き換える必要があります。そうでないように聞こえますか?

意図がバッファ内のすべてのデータを書き換えることである場合は、パフォーマンス上の理由から「破棄」を使用する必要があります。データの一部のみを書き込む場合は、「none」を使用できます。

http://msdn.microsoft.com/en-us/library/windows/desktop/bb147263(v=vs.85).aspx 「D3DLOCK_DISCARD でロックが呼び出されたときにグラフィック プロセッサがまだバッファを使用している場合、へのポインタ古いバッファ データの代わりに新しいメモリ領域が返されます。」

于 2012-08-09T18:46:34.440 に答える