「 2008年03月 」一覧

描画システムのMultiThread対応


スキニングメッシュもかろうじて表示できたので、諸々の部分をダブルバッファリングにして、描画とメインの実行ループの分離を行ってみました。文章にするとこれだけのことなのに苦戦しましたよ…。

  • DirectXのリソース作成・破棄はメインスレッドでやらなくてはいけない
  • アプリケーションの実行はサブスレッドになる。
  • DirectXは、WndProcが実行されるスレッドで初期化されなくてはならない。また基本的にこのスレッドで実行されるべきである。
  • 当然、描画要求を出してタイミングがきたら描画。このためバッファリング必要

色々と書き換えてようやく、ポイントライトなシェーダーを実行させるところまでは出来ました。しかしスキキングメッシュ関連で、マルチスレッド化に伴いフォルスシェアリングが起こりそうだったので、またスキニングメッシュは表示できない状態へ戻りました…


DirectXのロックの謎


DirectX9のLockについて、調べてみたことをメモしておきます。

Textureのロックには、範囲指定があるが、Lockは複数回できるのか?

まずは推測から。
範囲指定がわざわざあるということは、部分1でLockし、部分2でLockしても問題なさそうである。また、領域が重なった場合は多重ロックになりNGとなる。と予想。

結果は・・・領域が被っていようが、別部分であろうがNGでした。どうやら、範囲指定はパフォーマンスをあげるためのダーティー判断くらいでしかなさそう。ただし、異なるミップマップについては同時Lockは可能のようです。

 

VertexBufferのロックはどうだろうか?

テクスチャが上記のような結果になったのだから、やはり多重ロックは失敗するだろうと予想。あるいはNO_OVERWRITEフラグなんかあるし、領域さえ違えば成功するのかも知れない。

結果は・・・領域が被っていようが、別であろうが、多重ロックは成功する。多重ロック後は、正しくUnlock呼ばないといけないそうです。

このロックの挙動の違いは問題になりそう…。そもそも多重ロックを許可しない方針でプログラムを作っていくべきかも知れません。

上記を試したのは、DirectX9.0cで、GeForce7600GT on Vista(x64)です。他のメーカーのカードでは異なる結果となるかも知れません。 次は、OpenGLのMapBufferとか調べてみる?!

 


インテル スレッディングビルディングブロック


最近の自分のぐっと来るポイントに、templateとスレッドがあったわけですが、これらをミックスした書籍があるとのことで探し回ってました。

2月末に出ていたらしく、その本のタイトルは、”インテル スレッディングビルディングブロック” TBBと略されるらしいです。オープンソース版と商用版が提供されてます。

ざっと読んでみたところ、ループをスレッドを使うように展開したparalell_for関係の使い方と、作業をパイプライン化、もしくは単純にタスク化しての使い方の説明で終わったと思います。
他にも、単純にSTLコンテナをスレッドセーフにするためにロックさせるものよりも効率の良いコンテナ群の説明とか。

感想としては、もうちょっと内部的な話を見たかったのですが。それはOSSで提供されているコードを見ろってことでしょうか。しかし、2コアのシステムでこれを有意義に使える状況って限られるんじゃないですかねぇ…

少なくともゲームにはこのままじゃ使えなさそうです。