Seaside Laboratory

Posts

DirectDraw で描画プライオリティ

そろそろ優先順位付描画を実装しなきゃイカンと思いコードを書いてみた。処理の大まかな流れは、

  1. 描画命令が呼ばれたら描画を行わず座標や描画順位といった情報をリストに登録。
  2. 全ての処理が終わったら、リストの内容を描画順位を基準にソートする。
  3. リストを順に辿って描画する。

こんな感じ。ミソとなるソート方法は以下の 2 パターン。

  • 描画命令が呼ばれる度にリスト巡回して適切な位置に挿入する。
  • 最終描画前に全部ソートをする。

スプライトを 8 回描画した場合の参照回数を比較してみた。

前者の方法での最悪なシナリオは描画順位が全部同じというケース。こうなった場合は描画の度にリストを最後まで見る羽目になる。

1 回目 = 0 (まだリストにデータがない)
2 回目 = 1 (さっき追加したデータを参照)
  :
  :
8 回目 = 7

合計 28 回。

後者の方法の場合は描画順位の値によって速度が変わったりはしない隣接交換法の場合だと、比較元は全部調べる必要があるが比較先は最小値が決まる度に減っていく。

1 回目 = 8 (1 回目は全て参照)
2 回目 = 7 (最小値が 1 つ決定している)
  :
  :
8 回目 = 1

合計は 36 回。これに比較元の参照回数である 8 を加えると 44 回になる。

何も考えずに両方のコードを書いたが、どっちもクソ重てぇ!遅くなる原因になったのは Debug モードの STL。以前は Debug モードでも 50 FPS くらいでていたが、優先順位付描画を実装した途端、酷いケースだと 12 FPS まで低下してしまう。さすがに、ここまで遅いと実用レベルじゃねーです。Release モードなら速いんだけど。