デバイスステート切り替えコスト

仕事が少し落ち着いてきたので、久しぶりにHamana の開発をやった。やりたいことはいくらでもあるのだが、大体月に2日程度しか工数を割り振れないのでなかなか進まない。
まあ仕事と違って、のんびりが許されるから楽しいんだけど。

さて、Hamana で動画再生中にファイルリストとサムネイルウインドウを表示させると妙に重かったのだが、まあテクスチャマップされたポリゴンを大量に描画しているので、こんなものだろうとあまり気に留めていなかった。(文字もサムネイルもすべてテクスチャで描画している)

ところが、今日別件でhamana上で大量のテクスチャマップされたポリゴンを描画させてみたら軽い軽い! つまりサムネイルかファイルリストの描画になんらかの無駄があると判明したので詳しく調べることにした。

で、結局直接の原因はサムネイルの描画が次の処理シーケンスになっていたことだった。
  1. すべてのサムネイルに対して2から5を繰り返す
  2. Direct3Dデバイスの頂点フォーマットをテクスチャなしのものに設定する
  3. サムネイルの枠と背景を描画
  4. Direct3Dデバイスの頂点フォーマットをテクスチャありのものに設定する
  5. サムネイル画像を描画
つまり2,4の頂点フォーマットの切り替えをサムネイル画像ごとに行っていたのがマズかった。

これを次のようにしたらCPUの使用率が80%から10%まで改善した(毎秒60フレームで描画)。
  1. Direct3Dデバイスの頂点フォーマットをテクスチャなしのものに設定する
  2. すべてのサムネイルの枠と背景を描画
  3. Direct3Dデバイスの頂点フォーマットをテクスチャありのものに設定する
  4. すべてのサムネイル画像を描画


描画するサムネイルは高々20個程度のわけなので、これによって節約できる描画ステートの切り替えは40回程度なのだが、まさかここまでパフォーマンスに大きな影響を与えてるとは想像もつかなかった。

1/1