タイトル | : Re: FPS向上のコツ |
投稿日 | : 2008/12/18(Thu) 10:28:55 |
投稿者 | : 通りすがり < > |
はじめまして。
たまたま通りがかったので、ライブラリについてはリファレンスとサンプルを見せていただいた程度ですが、若干気になりましたので。
> ■ハードウェア編
> ハードウェアを入れ替えるならCPUよりグラフィックを交換したほうが低コストで済む。
プログラムによると思います。
例えばネットワークを使っている場合や、メインメモリを消費している場合は、メインメモリ、CPUを交換しないと速度向上は見込めません。
※ 3Dバリバリの最近のゲームを遊ぶためにはHLSL対応のビデオカードに変えることで速度向上は見込めますが、マザーボードを変えなければ効果はさほど見込めないと思います。
> グラフィックの設定で色数やリフレッシュレートをできるだけ下げることでFPSは向上するがあまり期待できない。
最近のビデオカードでは、DMA転送をかけますので32bitCPU(バスが32bit)の場合ですと、32bit色で最高のパフォーマンスになるようにチューンされていることが多いです。
リフレッシュレートはそのままプログラムのスピードに影響しますので、見慣れている60fpsから変えない方が良いかと思います。
※ 例えば30fpsに変えたとしたら、60fpsでプログラムが動いていても16msecの間、ビデオカードにブロックされるということが起こります。DirectXではIDirect3DDevice::Present()で、ブロックされます。
> ■プログラミング編
> スプライトサイズは小さいほうがいい。
管理人さんが書かれておられますが2のべき乗にすることが重要です。
32x32,64x64,128x128のようなサイズです。
これはソフトウェアエミュレーションで動くか、ハードウェア(HAL)で動くかの差です。
※ もちろんビデオカードで差異があります。
個人的にこうしたほうが速いという点
出来る限りメモリは連続して使うような設計にする。
→ コード的には静的メモリは、各コード内に書くのではなく、どこかにまとめて書いておくと、連続してメモリにマッピングされ易いと思います。
ゲーム中で使用するループは出来るだけ小さく。
→ コード的には大きなループをひとつまわすのではなく、複数のループに分けて動かすほうが、CPUのキャッシュに乗りやすく、大幅な速度向上が見込める。
余談
ライブラリの内部構造がわからないので難しいですが、ゲーム処理と描画は分ける。
構造的に、
・キャラクターの移動などを行う
・当たり判定などを行う
・描画を行う
と、言う風に完全にルーチンを独立させるべきです。
また、VC#、VBではどの程度実現できるかは不明ですが、大きなメモリは静的にプログラムの初期化(起動時)に確保しておくようにします。
具体的には敵のクラスなどの複数使われる可能性のあるクラスは、出来るだけ最大数を起動時に確保し、使うか使わないかはフラグなどで管理するようにします。
動的に確保すると、ヒープのガーベージコレクションがいつ起こるか判らなくなりますので、所々でいきなり重くなったり、最悪の場合は毎ループ重くなる可能性があります。
これくらいを意識しながら書く様にすればかなりの速度向上を目指せると思います。