Seaside Laboratory

Post

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 モードなら速いんですけど。