2009年6月2日火曜日

DXライブラリPortableを使う上で。最適化まとめ

FPSが出ないのですが~と仰る方がそれなりにいらっしゃいますので、幾つかプログラムの高速化に関するポイントを列挙しとこうと思います。



  1. 画像はなるべく一枚に纏める。

  2. 大量に描画する物は16ビットカラーに変換してしまう。

  3. double型は使わない。

  4. 算術系が重いならfastmath.hをインクルードしてみる。

  5. ビット演算を使う。

  6. inline指定を忘れない。

  7. 使っているアルゴリズムそのものを見直す。


ざっとこれくらいでしょうか。以降、解説です。

1.画像はなるべく一枚に纏める。

これによってDXライブラリ内部で行っているテクスチャ変更処理を減らす事ができます。具体的な方法として、同時に使いそうな画像を一まとめにしてLoadGraphで読み込み、DerivationGraphでグラフィックハンドルを生成する方法が一つ。LoadDivGraphで読み込むのがもう一つです。

2.大量に描画する物は16ビットカラーに変換してしまう。

特に弾幕等の描画回数の多いものに効果を発揮します。ConvertGraphFormatによって変換が可能です。ただし、同じテクスチャを使っているグラフィックハンドルにも変換が適用されてしまうので注意してください。弾幕と立ち絵は別々の画像にするなど工夫してください。

3.double型は使わない。

floatで済むならそちらを使った方が演算が高速に終わります。余った時間がFPS向上につながります。

4.算術系が重いならfastmath

fastmath.hをインクルードすると高速な算術関数が使えます。もちろん、計算精度は若干落ちます。

5.ビット演算を使う。

たとえば0と1の状態を交互に繰り返させるとき、変数と1をXOR演算することで条件分岐を使うことなく実現できます。賢く使えば非常に強力な最適化の道具になります。

6.inline指定を忘れない。

何度も何度も呼ぶ関数にはinline指定をつけてしまいましょう。関数呼び出しの処理はけっこう重いです。呼び出す頻度の高い関数はinline指定してやれば一寸高速になります。塵も積もればなんとやら、です。

7.使っているアルゴリズムそのものを見直す。

たとえば円形当たり判定。sqrt関数を呼ぶ代わりに両辺を二乗すると高速になるのはSTG組んだ事のある方ならご存知でしょう。他にもデータの管理を工夫する、複雑な計算式をなるべく簡略化してしまう、ベクトルの内積を使って三角関数を撤廃する等です。

今回は適当に思いついた物だけ紹介しました。そのうちWikiに専用のページでも設けようかと思います。

0 件のコメント:

コメントを投稿