ゲームをつくってるんですがCOSやSINを多用すると、めちゃめちゃ重くなってゲームが遅くなります。
私のPCの性能が悪いからなのでしょうか?
VISTAでメモリ512Mです。
原因わかる方教えて下さい
なぜ??
Re:なぜ??
>私のPCの性能が悪いからなのでしょうか?
Vistaとメモリだけでは何とも判断はつきませんが、可能性としてはありえます。
少しメモリが少ない(最低1GBくらいは欲しいところ)気もしますし、
CPU / GPUのパワーが不十分なのかもしれません。
>ゲームをつくってるんですがCOSやSINを多用すると、めちゃめちゃ重くなってゲームが遅くなります
本当に sinや cosが重いのか、どうか。
まず、それを確認した方がいいと思います。
sinや cosの計算をしないようにしたバージョンを作って試してみてはどうでしょうか?
仮に、ゲームが重い原因が本当に cosや sinだったとしたら。
それを解消するには以下の2点が有効だと思います。
1 sin/cosが使われているところを精査し、その処理が必要がどうかを
検討・修正します。
不要なところで使ってしまうことはよくあるので、その無駄をなくします。
2 それでも重いようならゲーム向けにカスタマイズした sin/cos関数を作ります。
たいていのゲームでは1周 360度を表現するのに標準関数に求められるほどの精度は
必要なかったりしますので、計算を端折って高速化したバージョンの sin/cos関数を
作っておけば、それなりに高速になると思います。
Re:なぜ??
何回計算したらどれ位時間がかかるのか把握しておくのも大事だと思います。
2000万回cosの計算するのにどれ位時間がかかるか計測するプログラムです。
うちのパソコンだと1秒でした。
math.hの関数は時間がかかると言えども1秒間に2000万回も計算できるわけです。
逆に言えば、これが原因だとすると、簡単なゲームや2Dゲームなどで
1秒間に2000万回も計算しないといけないようなプログラムは
それはそれで問題があるように思います。
(多数のポリゴンの計算などになると必要かもしれませんが)
案外他に原因がある可能性が高いです。
例えばDXライブラリでいえばSetFontSizeや画面をキャプチャする関数などを多用すると重くなります。
フォントサイズを毎回指定するときは、この関数を呼ぶのではなく、
フォントハンドルを最初に作って描画しないといけません。
また、見えないところで画像を何枚も重ねて描画していたり、
アルファブレンドを大きな面積でおこなっていたりしていても遅くなります。
このように関数の使い方を間違ったり、非効率なプログラムを書いたりしていても処理は遅くなるので、
その辺も見直してみるといいと思います。
もしもcos,sin計算が原因で、そこまで厳密な計算が必要ないときは、
あらかじめ配列に計算結果を代入しておくと言う方法もあるようです。
計算結果を格納する配列要素を1000個位用意しておき、
2π/1000ずつ予め計算しておいて格納しておくという方法です。
あまり良い方法ではないかもしれませんが。
しかしビスタで512Mは少なすぎると思います。
無理にビスタを入れる必要は無いのではないでしょうか?
スペックが低いのに重いOSを入れると使い物にならなくなってしまう可能性ありますし。
もしウィルスソフトとかいれてしまうと、常にメモリオーバーしている状態になっていると思います。
PF使用量はいくらになっていますか?
メモリオーバーになっていると、極端に処理は遅くなります。
#include <stdio.h> #include <math.h> #include <time.h> #define PI 3.1415926535897932 int main(){ int i; double c; clock_t t; t = clock();//時間を格納 printf("計測中です\n"); for(i=0;i<20000000;i++){ c = cos( PI/1000*(i%1000) ); } printf("%.3f秒\n",(clock()-t)/(double)CLOCKS_PER_SEC); } 実行結果例 計測中です 1.046秒
2000万回cosの計算するのにどれ位時間がかかるか計測するプログラムです。
うちのパソコンだと1秒でした。
math.hの関数は時間がかかると言えども1秒間に2000万回も計算できるわけです。
逆に言えば、これが原因だとすると、簡単なゲームや2Dゲームなどで
1秒間に2000万回も計算しないといけないようなプログラムは
それはそれで問題があるように思います。
(多数のポリゴンの計算などになると必要かもしれませんが)
案外他に原因がある可能性が高いです。
例えばDXライブラリでいえばSetFontSizeや画面をキャプチャする関数などを多用すると重くなります。
フォントサイズを毎回指定するときは、この関数を呼ぶのではなく、
フォントハンドルを最初に作って描画しないといけません。
また、見えないところで画像を何枚も重ねて描画していたり、
アルファブレンドを大きな面積でおこなっていたりしていても遅くなります。
このように関数の使い方を間違ったり、非効率なプログラムを書いたりしていても処理は遅くなるので、
その辺も見直してみるといいと思います。
もしもcos,sin計算が原因で、そこまで厳密な計算が必要ないときは、
あらかじめ配列に計算結果を代入しておくと言う方法もあるようです。
計算結果を格納する配列要素を1000個位用意しておき、
2π/1000ずつ予め計算しておいて格納しておくという方法です。
あまり良い方法ではないかもしれませんが。
しかしビスタで512Mは少なすぎると思います。
無理にビスタを入れる必要は無いのではないでしょうか?
スペックが低いのに重いOSを入れると使い物にならなくなってしまう可能性ありますし。
もしウィルスソフトとかいれてしまうと、常にメモリオーバーしている状態になっていると思います。
PF使用量はいくらになっていますか?
メモリオーバーになっていると、極端に処理は遅くなります。