ページ 11

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

Posted: 2011年7月22日(金) 06:10
by kz
龍神録プログラミングの館を見て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;
}


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

Posted: 2011年7月22日(金) 15:04
by 五反田
パッと見ですが、
(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;
}

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

Posted: 2011年7月25日(月) 21:45
by kz
ありがとうございます。

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