fps60にしたい

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

fps60にしたい

#1

投稿記事 by 寺初心者 » 15年前

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();
}

kazuoni

Re:fps60にしたい

#2

投稿記事 by kazuoni » 15年前

一般化とはどのようなことを指しているか明確にしてください。
また、上記だけではエラーが出ますと言われても、何のエラーなのかもわからないので、
詳細の追記をよろしくお願いします。

Dixq (管理人)

Re:fps60にしたい

#3

投稿記事 by Dixq (管理人) » 15年前

勿論出来ますよ^^
一般化というのは龍神録のプログラムでだけでなく自分のプログラムにもササっと導入できるようにするって事ですかね?
見た感じ問題なさそうですが、エラーが出るならそのメッセージを教えてください

寺初心者

Re:fps60にしたい

#4

投稿記事 by 寺初心者 » 15年前

一般化とは単にDXライブラリで表示させるだけです。

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

Expression( str!=NULL)

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

寺初心者

Re:fps60にしたい

#5

投稿記事 by 寺初心者 » 15年前

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にしたい

#6

投稿記事 by 寺初心者 » 15年前

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

Libra

Re:fps60にしたい

#7

投稿記事 by Libra » 15年前

Expression:(str!=NULL)

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

寺初心者

Re:fps60にしたい

#8

投稿記事 by 寺初心者 » 15年前

ちょっと長くなりますが

//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の方はうまくいっています。

Mist

Re:fps60にしたい

#9

投稿記事 by Mist » 15年前

ファイルのオープンはどこでしているんですか?
ファイルオープンせず(fpが不定値のまま)、fprintfすればエラーになるのは当然ですね。

寺初心者

Re:fps60にしたい

#10

投稿記事 by 寺初心者 » 15年前

>Mistさん
私は
fprintf(fp,"%d:%d\n",fps_count,term);
if(fps_count==600)
fclose(fp);
の部分を取ってしまいました。
仮にするならどこが適切ですか?お願いします。

Libra

Re:fps60にしたい

#11

投稿記事 by Libra » 15年前

使う関数が違います。

fprintf→sprintf

Mist

Re:fps60にしたい

#12

投稿記事 by Mist » 15年前

いや、その三行いらないんじゃないかな。
43章ダウンロードしてみましたけど、そこのソースにはそんな処理入ってませんから(^-^;

Libra

Re:fps60にしたい

#13

投稿記事 by Libra » 15年前

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

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

寺初心者

Re:fps60にしたい

#14

投稿記事 by 寺初心者 » 15年前

fprintf(fp,"%d:%d\n",fps_count,term);
if(fps_count==600)
fclose(fp);
消すと実行できるんですけどfps150くらいでるんです。
staticで
static int term,i,gnt;
としても結果は同じでした。

Libra

Re:fps60にしたい

#15

投稿記事 by Libra » 15年前

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にしたい

#16

投稿記事 by 寺初心者 » 15年前

}の場所を変えろってことですよね?
すごい数値が変化して変になりました。

Libra

Re:fps60にしたい

#17

投稿記事 by Libra » 15年前

インデント直すので失敗してました。
#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にしたい

#18

投稿記事 by 寺初心者 » 15年前

Debug Assertion Failed!

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

Expression:(str!=NULL)

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

Libra

Re:fps60にしたい

#19

投稿記事 by Libra » 15年前

上のは最初のソースをインデントを直しただけのものです。
つまり、最初のエラーが出てるままです。

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



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

寺初心者

Re:fps60にしたい

#20

投稿記事 by 寺初心者 » 15年前

これは動きますね。ちゃんとした結果もでます。
本当にありがとうございます。
どうしても上のソースで出来なければ、これでやってみます。

Libra

Re:fps60にしたい

#21

投稿記事 by Libra » 15年前

先程、自分の環境にDXライブラリ入れて動かしたところ、
正常に動いたのですが・・・。
FPS:59.9あたりで安定してますね。

寺初心者

Re:fps60にしたい

#22

投稿記事 by 寺初心者 » 15年前

ありがとうございます。しかし、fpsを60に制御するとなにも
かもカクカクになってしまします。
この原因はなんなのでしょうか?
fpsを制御しないと普通にアニメーションするんですが・・・・

Re:fps60にしたい

#23

投稿記事 by » 15年前

数百回やって正常だとしていたものを60回しかやってないんだからコマ落ちもする

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

閉鎖

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