なぜ??

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
スコアラー

なぜ??

#1

投稿記事 by スコアラー » 17年前

ゲームをつくってるんですがCOSやSINを多用すると、めちゃめちゃ重くなってゲームが遅くなります。
私のPCの性能が悪いからなのでしょうか?
VISTAでメモリ512Mです。
原因わかる方教えて下さい

Justy

Re:なぜ??

#2

投稿記事 by Justy » 17年前


>私の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:なぜ??

#3

投稿記事 by スコアラー » 17年前

アドバイスどうもありがとうございます。
ちと、色々と試してみます。
またわからないことがあれば教えて下さいね☆

管理人

Re:なぜ??

#4

投稿記事 by 管理人 » 17年前

何回計算したらどれ位時間がかかるのか把握しておくのも大事だと思います。
#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使用量はいくらになっていますか?
メモリオーバーになっていると、極端に処理は遅くなります。

tk-xleader

Re:なぜ??

#5

投稿記事 by tk-xleader » 17年前

sinやcosは浮動小数点を使っていますから、遅くなってもおかしくないと思いますよ。
いったん、巨大な整数によって精度を確保しながらマクローリン展開するという実装をしてみるのがいいかもしれません。

スコアラー

Re:なぜ??

#6

投稿記事 by スコアラー » 17年前

どうもありがとうございます。
PCを買ってまだ一年ぐらいなので詳しいことはわかりませんが、
いろいろと試してみますね☆

スコアラー

Re:なぜ??

#7

投稿記事 by スコアラー » 17年前

関係ないんですけど、
東方でショットボタン「Z」押しっぱなしの方向キーの左を押しっぱなしの時に、
ボムボタン「X」を押すと、ボムが出ないんですけど、これって私のキーボードが壊れて
るんですかね?
ちなみに、方向キーの右を押しっぱの時はボムがちゃんと出ました。

御津凪

Re:なぜ??

#8

投稿記事 by 御津凪 » 17年前

キーボードによっては同時押しが利かない組み合わせがあるものがあります。
ゲーム用に複数キーの入力に対応したもの(最大7つ)がありますが、
同時押しが利かないキーは、キーボードによってまちまちです。

どうしても耐えられないのなら、買い換えたほうが良いかもしれませんよ。
(ついでに自分の入力スタイルにあったものを選ぶと得)

閉鎖

“C言語何でも質問掲示板” へ戻る