[リストへもどる]
一括表示
タイトルFPS向上のコツ
記事No72
投稿日: 2008/08/13(Wed) 16:37:22
投稿者ひらい
FPSをあげるための工夫を少々メモしておきます。なお、こうしたほうが早いとかそこは違うというご意見は大歓迎です。

■ハードウェア編
ハードウェアを入れ替えるならCPUよりグラフィックを交換したほうが低コストで済む。
マザーのオンボードグラフィックを使用しているときは使用するグラフィックメモリーを少しでも多くする。DVMT機能を使い、Maximum DVMTとすることで飛躍的に向上することもある。
グラフィックの設定で色数やリフレッシュレートをできるだけ下げることでFPSは向上するがあまり期待できない。

■プログラミング編
扱う最大スプライトサイズをInitializeで指定するが、小さいほうがいい。
スプライトサイズは小さいほうがいい。
SpriteShowによってスプライトを表示するが、一度表示したらSpriteHideを行うまで透明度やX位置を変更してもSpriteShowはいらない。しばらく表示しない場合はSpriteHideで消しておき、また表示するときにSpriteShowで表示させる。できるだけ現在使用するスプライトだけに絞る。頻繁に表示させるスプライトは表示したままにしておき、透明度だけで処理するとプログラミング的に楽。

■参考までに・・・
CPU Intel Celeron430 1.8GHz
マザー ASUS P5GC-MX-1333
メモリー 512MB(667)×2枚
OS:WindowsXP Home SP3
電源 KRPW-V300W

このスペックのPCで大小15枚程度のスプライトを処理して30〜56fpsでした。30以下にならなければかくかくした印象はありません。

タイトルRe: FPS向上のコツ
記事No74
投稿日: 2008/08/15(Fri) 16:30:33
投稿者田村(管理人)
参照先http://denkabow.com
ひらいさん、こんにちは。

テクニックに関する投稿ありがとうございます。
ひらいさんの指摘は、おおむね正しいです。

内容に補足するとすれば

> 扱う最大スプライトサイズをInitializeで指定するが、小さいほうがいい。
Initializeメソッドで最大スプライトサイズを指定するのは、動作させるビデオカードを選別するためです。
例えば、ATI RAGE, intel810は、Direct3Dで扱えるテクスチャサイズが1024x1024ドットまでです。これらのビデオカードで動作させたい場合は、最大スプライトサイズを1024に設定します。

> スプライトサイズは小さいほうがいい。
確かに小さいほうがよいです。
スプライトサイズは、幅、高さとも2の累乗に設定すると尚よいです。


> FPSをあげるための工夫を少々メモしておきます。なお、こうしたほうが早いとかそこは違うというご意見は大歓迎です。
>
> ■ハードウェア編
> ハードウェアを入れ替えるならCPUよりグラフィックを交換したほうが低コストで済む。
> マザーのオンボードグラフィックを使用しているときは使用するグラフィックメモリーを少しでも多くする。DVMT機能を使い、Maximum DVMTとすることで飛躍的に向上することもある。
> グラフィックの設定で色数やリフレッシュレートをできるだけ下げることでFPSは向上するがあまり期待できない。
>
> ■プログラミング編
> 扱う最大スプライトサイズをInitializeで指定するが、小さいほうがいい。
> スプライトサイズは小さいほうがいい。
> SpriteShowによってスプライトを表示するが、一度表示したらSpriteHideを行うまで透明度やX位置を変更してもSpriteShowはいらない。しばらく表示しない場合はSpriteHideで消しておき、また表示するときにSpriteShowで表示させる。できるだけ現在使用するスプライトだけに絞る。頻繁に表示させるスプライトは表示したままにしておき、透明度だけで処理するとプログラミング的に楽。
>
> ■参考までに・・・
> CPU Intel Celeron430 1.8GHz
> マザー ASUS P5GC-MX-1333
> メモリー 512MB(667)×2枚
> OS:WindowsXP Home SP3
> 電源 KRPW-V300W
>
> このスペックのPCで大小15枚程度のスプライトを処理して30〜56fpsでした。30以下にならなければかくかくした印象はありません。

タイトルRe: FPS向上のコツ
記事No82
投稿日: 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ではどの程度実現できるかは不明ですが、大きなメモリは静的にプログラムの初期化(起動時)に確保しておくようにします。
具体的には敵のクラスなどの複数使われる可能性のあるクラスは、出来るだけ最大数を起動時に確保し、使うか使わないかはフラグなどで管理するようにします。
動的に確保すると、ヒープのガーベージコレクションがいつ起こるか判らなくなりますので、所々でいきなり重くなったり、最悪の場合は毎ループ重くなる可能性があります。


これくらいを意識しながら書く様にすればかなりの速度向上を目指せると思います。

タイトルRe^2: FPS向上のコツ
記事No83
投稿日: 2008/12/18(Thu) 23:03:38
投稿者田村(管理人)
参照先http://denkabow.com
通りすがりさん、こんばんは。
貴重なご意見、参考になりました。
今後の開発に生かしたいと思います。
ありがとうございました。

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