0

CPU で生成された画像を Direct3D 9 でレンダリングする必要がありますが、テクスチャ データをグラフィックス カードに取得する最善の方法がわかりません。多くの方法があるようです。

私の使用パスは、フレームごとに次の行に沿って進みます

  1. テクスチャを使ってたくさんのものをレンダリングする
  2. テクスチャのいくつかの部分を更新します (以前のレンダリングで使用された可能性があります)。
  3. テクスチャでさらにいくつかのものをレンダリングする
  4. テクスチャの別の部分を更新する
  5. 等々

これを行うにはいくつかの方法を考えましたが、どれを使用すればよいかわかりません。各方法のベンチマークを検討しましたが、取得した結果が一般的なハードウェアを表しているのか、それとも自分のハードウェアのみを表しているのかを知る方法はありません.

  • このタスクのテクスチャに最適なプールは?
  • このテクスチャを更新する最良の方法は何ですか?
    1. 更新する必要があるリージョンごとに LockRect と UnlockRect を呼び出します
    2. テクスチャ全体に対して LockRect と UnlockRect を呼び出す
    3. D3DLOCK_DISCARD を使用してテクスチャ全体の LockRect と UnlockRect を呼び出し、RAM からビットマップにコピーします。
    4. 「更新」する必要があるたびに、まったく新しいテクスチャを作成する
    5. 1、2、または 3 を使用して D3DPOOL_SYSMEM のサーフェスを更新してから、UpdateSurface を使用してこのサーフェスからテクスチャのレベル 0 を更新します
    6. 5 と同じですが、RECT を指定して必要な領域全体をカバーします
    7. 5 と同じですが、更新した地域ごとに 1 つずつ、複数の呼び出しを行います
    8. おそらく私がまだ考えていないこれを行う別の方法...

更新する領域は通常、テクスチャ全体のサイズに比べてかなり小さいことに注意してください。たとえば、テクスチャが 1024*1024 で、5 つほどの 64*64 領域を更新したい場合があります。

4

2 に答える 2

1

複数の領域を更新する必要がある場合は、テクスチャ全体をロックし、D3DLOCK_NO_DIRTY_UPDATE フラグを使用してから、領域ごとに AddDirtyRect を呼び出してからロックを解除する必要があります。

もちろん、これはすべてテクスチャなどのサイズに依存します。小さなテクスチャの場合は、RAM から全体をコピーする方が効率的かもしれません。

于 2009-08-07T14:56:21.057 に答える
-1
  • D3DPOOL_DEFAULT
  • D3DUSAGE_DYNAMIC
  • 更新する必要があるリージョンごとに LockRect と UnlockRect を呼び出します

--> これが最速!

ベンチマークは続きます...

于 2009-07-28T15:18:40.987 に答える