ページ 11

fps60にしたい

Posted: 2009年12月04日(金) 11:51
by 寺初心者
http://dixq.net/rp/43.html

//fps
#define FLAME 60

//fpsのカウンタ、60フレームに1回基準となる時刻を記録する変数
int fps_count,count0t;
//平均を計算するため60回の1周時間を記録
int f[FLAME];
//平均fps
double ave;
============以下略===============

管理人様のfpsを60に制御するプログラムなんですが
DXライブラリでこのプログラムを一般化して使うのは可能でしょうか?変数はすべて
定義しましたが、エラーがでます。メインは以下のようにしました。

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && Key[KEY_INPUT_ESCAPE]==0){
draw_fps(0,0);
fps_count++;
ScreenFlip();
fps_wait();
}

Re:fps60にしたい

Posted: 2009年12月04日(金) 12:01
by kazuoni
一般化とはどのようなことを指しているか明確にしてください。
また、上記だけではエラーが出ますと言われても、何のエラーなのかもわからないので、
詳細の追記をよろしくお願いします。

Re:fps60にしたい

Posted: 2009年12月04日(金) 12:15
by Dixq (管理人)
勿論出来ますよ^^
一般化というのは龍神録のプログラムでだけでなく自分のプログラムにもササっと導入できるようにするって事ですかね?
見た感じ問題なさそうですが、エラーが出るならそのメッセージを教えてください

Re:fps60にしたい

Posted: 2009年12月04日(金) 12:24
by 寺初心者
一般化とは単にDXライブラリで表示させるだけです。

エラーは
ポップアップで
Debug Assertion Failed
File\なんたら\printf.c
Line55

Expression( str!=NULL)

です。よろしくお願いします。環境はVC++EEです。

Re:fps60にしたい

Posted: 2009年12月04日(金) 12:41
by 寺初心者
Debug Assertion Failed!

Program:...
File:fprintf.c
Line:55

Expression:(str!=NULL)

For information on how your program can cause an assertion failure,see the Visual C++ documentation on asserts

って浮かび上がります。私がファイルの定義が分からないからだと
思います。
下のかたのmouseさんとまったく同じものです。
ttp://homepage1.nifty.com/MADIA/vc/vc_bbs/200801/200801_08010003.html

Re:fps60にしたい

Posted: 2009年12月04日(金) 13:55
by 寺初心者
printfの警告がでたので
fprintf(fp,"%d:%d\n",fps_count,term);
if(fps_count==600)
fclose(fp);
の部分をとったらコンパイルでき動きましたけど
fpsが250とか・・・
私には分からないですね。分かる人がいたらよろしく
お願いいたします。

Re:fps60にしたい

Posted: 2009年12月04日(金) 15:18
by Libra
Expression:(str!=NULL)

警告の通り、文字列操作がうまく行っていないのでしょう。
表示させている部分を含む、FPS関数を載せてください。

Re:fps60にしたい

Posted: 2009年12月04日(金) 15:49
by 寺初心者
ちょっと長くなりますが

//fps
#define FLAME 60

//fpsのカウンタ、60フレームに1回基準となる時刻を記録する変数
int fps_count,count0t;
//平均を計算するため60回の1周時間を記録
int f[FLAME];
//平均fps
double ave;
File *fp;//私が加えたもの

//FLAME fps になるようにfpsを計算・制御
void fps_wait(){
int term,i,gnt;
static int t=0;
if(fps_count==0){//60フレームの1回目なら
if(t==0)//完全に最初ならまたない
term=0;
else//前回記録した時間を元に計算
term=count0t+1000-GetNowCount();
}
else //待つべき時間=現在あるべき時刻-現在の時刻
term = (int)(count0t+fps_count*(1000.0/FLAME))-GetNowCount();

fprintf(fp,"%d:%d\n",fps_count,term);
if(fps_count==600)
fclose(fp);
if(term>0)//待つべき時間だけ待つ
Sleep(term);
gnt=GetNowCount();
if(fps_count==0)//60フレームに1度基準を作る
count0t=gnt;
f[fps_count]=gnt-t;//1周した時間を記録
t=gnt;
//平均計算
if(fps_count==FLAME-1){
ave=0;
for(i=0;i<FLAME;i++)
ave+=f;
ave/=FLAME;
}
fps_count = (++fps_count)%FLAME ;
}

//x,yの位置にfpsを表示
void draw_fps(int x, int y){
if(ave!=0){
DrawFormatString(x, y,color[0],"[%.1f]",1000/ave);
}
return;
}

をヘッダーに書いて上のメインファイルで関数として使ってます。
警告文は上の通りです。
ちなみにhttp://dixq.net/g/#s6の方はうまくいっています。

Re:fps60にしたい

Posted: 2009年12月04日(金) 16:23
by Mist
ファイルのオープンはどこでしているんですか?
ファイルオープンせず(fpが不定値のまま)、fprintfすればエラーになるのは当然ですね。

Re:fps60にしたい

Posted: 2009年12月04日(金) 16:26
by 寺初心者
>Mistさん
私は
fprintf(fp,"%d:%d\n",fps_count,term);
if(fps_count==600)
fclose(fp);
の部分を取ってしまいました。
仮にするならどこが適切ですか?お願いします。

Re:fps60にしたい

Posted: 2009年12月04日(金) 16:31
by Libra
使う関数が違います。

fprintf→sprintf

Re:fps60にしたい

Posted: 2009年12月04日(金) 16:39
by Mist
いや、その三行いらないんじゃないかな。
43章ダウンロードしてみましたけど、そこのソースにはそんな処理入ってませんから(^-^;

Re:fps60にしたい

Posted: 2009年12月04日(金) 16:51
by Libra
やりたい事がわかりました^^;
ファイルに前フレームの時間を保存して、
それを使ってfpsを制御しようとしてたのですね。
勘違いしてました、自分の上の書き込みは無しで。
寝ぼけてました、スミマセン・・・。

値を保持したいのであればstatic変数を用いれば良いです。

Re:fps60にしたい

Posted: 2009年12月04日(金) 17:08
by 寺初心者
fprintf(fp,"%d:%d\n",fps_count,term);
if(fps_count==600)
fclose(fp);
消すと実行できるんですけどfps150くらいでるんです。
staticで
static int term,i,gnt;
としても結果は同じでした。

Re:fps60にしたい

Posted: 2009年12月04日(金) 17:23
by Libra
ave=0; 
for(i=0;i<FLAME;i++) 
	ave+=f; 
	ave/=FLAME; 
}



この部分を
ave=0; 
for(i=0;i<FLAME;i++) 
	ave+=f; 
}
ave/=FLAME;


このように変更してみてはどうでしょう?

Re:fps60にしたい

Posted: 2009年12月04日(金) 17:39
by 寺初心者
}の場所を変えろってことですよね?
すごい数値が変化して変になりました。

Re:fps60にしたい

Posted: 2009年12月04日(金) 17:54
by Libra
インデント直すので失敗してました。
#define FLAME 60 

//fpsのカウンタ、60フレームに1回基準となる時刻を記録する変数 
int fps_count,count0t; 
//平均を計算するため60回の1周時間を記録 
int f[FLAME]; 
//平均fps 
double ave; 
File *fp;//私が加えたもの 

//FLAME fps になるようにfpsを計算・制御 
void fps_wait(){ 
	int term,i,gnt; 
	static int t=0; 
	if(fps_count==0){//60フレームの1回目なら 
		if(t==0)//完全に最初ならまたない 
			term=0; 
		else//前回記録した時間を元に計算 
			term=count0t+1000-GetNowCount(); 
	} 
	else //待つべき時間=現在あるべき時刻-現在の時刻 
		term = (int)(count0t+fps_count*(1000.0/FLAME))-GetNowCount(); 

	fprintf(fp,"%d:%d\n",fps_count,term); 
	if(fps_count==600) 
		fclose(fp); 
	if(term>0)//待つべき時間だけ待つ 
		Sleep(term); 
	gnt=GetNowCount(); 
	if(fps_count==0)//60フレームに1度基準を作る 	
		count0t=gnt; 
	f[fps_count]=gnt-t;//1周した時間を記録 
	t=gnt; 
	//平均計算 
	if(fps_count==FLAME-1){ 
		ave=0; 
		for(i=0;i<FLAME;i++) 
			ave+=f;
		ave/=FLAME; 
	} 
	fps_count = (++fps_count)%FLAME ; 
} 

//x,yの位置にfpsを表示 
void draw_fps(int x, int y){ 
	if(ave!=0){ 
		DrawFormatString(x, y,color[0],"[%.1f]",1000/ave); 
	} 
	return; 
}

Re:fps60にしたい

Posted: 2009年12月04日(金) 18:03
by 寺初心者
Debug Assertion Failed!

Program:...
File:fprintf.c
Line:55

Expression:(str!=NULL)

先程張り付けてコンパイルしましたが
上の結果でした。いやみじゃないんですが・・・

Re:fps60にしたい

Posted: 2009年12月04日(金) 18:12
by Libra
上のは最初のソースをインデントを直しただけのものです。
つまり、最初のエラーが出てるままです。

自分の持ってるソースを持ってくれば、動くでしょうが、
提示されているソースをなんとか直して動かしたいと・・・・。



とりあえず、動くものを^^;

Re:fps60にしたい

Posted: 2009年12月04日(金) 18:18
by 寺初心者
これは動きますね。ちゃんとした結果もでます。
本当にありがとうございます。
どうしても上のソースで出来なければ、これでやってみます。

Re:fps60にしたい

Posted: 2009年12月04日(金) 18:52
by Libra
先程、自分の環境にDXライブラリ入れて動かしたところ、
正常に動いたのですが・・・。
FPS:59.9あたりで安定してますね。

Re:fps60にしたい

Posted: 2009年12月04日(金) 19:56
by 寺初心者
ありがとうございます。しかし、fpsを60に制御するとなにも
かもカクカクになってしまします。
この原因はなんなのでしょうか?
fpsを制御しないと普通にアニメーションするんですが・・・・

Re:fps60にしたい

Posted: 2009年12月05日(土) 11:25
by
数百回やって正常だとしていたものを60回しかやってないんだからコマ落ちもする

バックバッファ使ってます?