fps制御するクラスを作ってみたのですが

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

fps制御するクラスを作ってみたのですが

#1

投稿記事 by kz » 14年前

龍神録プログラミングの館を見てC++でfpsを制御するクラスを作ってみたのですが上手く動きません。
どこを直したらいいのでしょうか?

コード:


class Cfps{
public:
	Cfps(void);
	Cfps(int set_fps);
	bool proc(int* wait_time , int* now_fps);
private:
	int seted_fps;
	LONGLONG before;
	LONGLONG log[100];
	int cnt;
};

Cfps::Cfps(void){
	seted_fps=60;
	before=GetNowHiPerformanceCount();
	for(int i=0;i<100;i++){
		log[i]=(int)((double)(1/60)*(double)(1000000));
	}
	cnt=0;
	return;
}

Cfps::Cfps(int set_fps){
	seted_fps=set_fps;
	before=GetNowHiPerformanceCount();
	for(int i=0;i<100;i++){
		log[i]=(int)((double)(1/set_fps)*(double)(1000000));
	}
	cnt=0;
	return;
}


bool Cfps::proc(int* wait_time , int* now_fps){
	bool draw_flag;
	LONGLONG now=GetNowHiPerformanceCount();
	LONGLONG past=now-before;
	before=now;
	int wait=(int)(((double)(1/seted_fps)*(double)(1000))-((double)(past)/(double)(1000)));
	if(wait<0){
		*wait_time=0;
		draw_flag=false;
	}else{
		*wait_time=wait;
		draw_flag=true;
	}
	log[cnt]=past;
	cnt++;
	if(cnt>=100) cnt=0;
	LONGLONG l=0;
	for(int i=0;i<100;i++){
		l+=log[i];
	}
	l/=100;
	*now_fps=(int)((double)(1000000)/(double)(l));
	return draw_flag;
}


アバター
五反田
記事: 21
登録日時: 14年前
住所: 千葉

Re: fps制御するクラスを作ってみたのですが

#2

投稿記事 by 五反田 » 14年前

パッと見ですが、
(double)(1/60)とか
(double)(1/set_fps)とかが多分予想している動きと違うように成っていると思われます。

優先順位的に
(1/60)の内側が先に整数として計算されてしまい、(double)(0)→0.0みたいに変換されてしまっているのではないでしょうか?

((double)1)/60とか
1.0/60.0とかに直して使うべきだと思います。

キャストももう少し減らしせばすっきりして、読み易くなるのではないでしょうか?

コード:

class Cfps{
public:
    Cfps(void);
    Cfps(int set_fps);
    bool proc(int* wait_time , int* now_fps);
private:
    int seted_fps;
    LONGLONG before;
    LONGLONG log[100];
    int cnt;
};
 
Cfps::Cfps(void){
    seted_fps=60;
    before=GetNowHiPerformanceCount();
    for(int i=0;i<100;i++){
        log[i]=1000000.0/60.0;
    }
    cnt=0;
    return;
}
 
Cfps::Cfps(int set_fps){
    seted_fps=set_fps;
    before=GetNowHiPerformanceCount();
    for(int i=0;i<100;i++){
        log[i]=1000000.0/set_fps;
    }
    cnt=0;
    return;
}
 
 
bool Cfps::proc(int* wait_time , int* now_fps){
    bool draw_flag;
    LONGLONG now=GetNowHiPerformanceCount();
    LONGLONG past=now-before;
    before=now;
    int wait=1000.0/seted_fps-past/1000.0;
    if(wait<0){
        *wait_time=0;
        draw_flag=false;
    }else{
        *wait_time=wait;
        draw_flag=true;
    }
    log[cnt]=past;
    cnt++;
    if(cnt>=100) cnt=0;
    LONGLONG l=0;
    for(int i=0;i<100;i++){
        l+=log[i];
    }
    l/=100;
    *now_fps=1000000.0/l;
    return draw_flag;
}

kz

Re: fps制御するクラスを作ってみたのですが

#3

投稿記事 by kz » 14年前

ありがとうございます。

動かしてみたら、上手く動きました。

閉鎖

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