ページ 11

FPSについて

Posted: 2012年8月19日(日) 18:37
by Gluek
C言語を学んで日が浅いGluekです


現在FPSの処理をmain関数ではなくfps.cpp,fps.hをつくって,そこに書き込むことにしました



いざデバッグしようとすると,うごくのですがFPSが表示されません



一体何がダメ何でしょうか?





fps.cpp

#include "DxLib.h"



void fps(){
int i;
static int t=0,ave=0,f[60];

int count2=0;

f[count2%60]=GetNowCount()-t;
t=GetNowCount();
if(count2%60==59){
ave=0;
for(i=0;i<60;i++)
ave+=f;
ave/=60;
}
if(ave!=0){
DrawFormatString(0, 0,GetColor(255,255,255),"%.1fFPS",1000.0/(double)ave);
DrawFormatString(0,20,GetColor(255,255,255),"%dms" ,ave);
}
return;
}


void wait_fanc(){
int term;
static int t=0;
term = GetNowCount()-t;
if(16-term>0)
Sleep(16-term);
t=GetNowCount();
return;
}




fps.h


#ifndef DEF_FPS_H

#define DEF_FPS_H


void fps();

void wait_fanc();

#endif

Re: FPSについて

Posted: 2012年8月19日(日) 19:11
by みけCAT
毎フレーム分の時間を60で割ってしまっているので、
計算上16fps以下に落ちないとif(avg!=0)により表示されないと思います。

嘘です。ごめんなさい。

このような誤解を産まないために、コードはcodeタグで囲んでください。

Re: FPSについて

Posted: 2012年8月19日(日) 19:23
by box
Gluek さんが書きました:

コード:

	int count2=0;
	f[count2%60]=GetNowCount()-t;
	if(count2%60==59){
fps() を実行するたびに、変数 count2 をゼロで初期化していて、
値を変更しているような形跡がありません。
大丈夫なんでしょうか。

Re: FPSについて

Posted: 2012年8月19日(日) 22:18
by Dixq (管理人)
何故表示されないのか、コードから考えてみましょう。
まず、表示を行っているのは

if(ave!=0){
DrawFormatString(0, 0,GetColor(255,255,255),"%.1fFPS",1000.0/(double)ave);
DrawFormatString(0,20,GetColor(255,255,255),"%dms" ,ave);
}

ですよね。
そして、それが表示されるのはaveが0ではない時です。
ではどうすればaveが0ではなくなるのでしょうか。

aveを変更しているのは
if(count2%60==59){
のスコープのみのようです。
ではcount2はどのように変化するのでしょうか。

count2は
int count2=0;
から変更されているように見えません。
従って表示されないのでしょう。

このように何故動作しないのか、理由を考えていけばわかると思います。
また、複雑で一見分からない時は、ブレイクポイントを置いて確認していくと分かりやすいです。

Re: FPSについて

Posted: 2012年8月24日(金) 16:36
by Gluek
みなさん返答ありがとうございます



あれから二日間必死にいろいろ策を講じました



count2を1にしたりやってみたのですが全く表示されませんでした



数値を変える処理というのは具体的にどのような処理をすればよいのでしょうか?


あとあのプログラムだと表示はされてないけどちゃんとfpsは計算できているのでしょうか?



どうか、もう少しヒントを出していただければと思います

Re: FPSについて

Posted: 2012年8月24日(金) 17:13
by softya(ソフト屋)
読み辛くなるので改行を減らしてもらえると嬉しいです。

いくつかお聞きします。
1) Dixq (管理人)さんも書いていますが、ブレークポイントは試されましたか?
2) if(count2%60==59)という条件は成立するのはどういう場合でしょう?

色々悩まれたとは思いますが、根本的な問題はC言語の基本的なことが理解できていないことだと思います。
なので、
3) どんなサイトや書籍でC言語の入門の勉強をされていますか?
をお聞きしたいです。

Re: FPSについて

Posted: 2012年8月24日(金) 17:31
by box
Gluek さんが書きました: count2を1にしたりやってみたのですが全く表示されませんでした
意味をわからずに、そういうことだけしてもダメでしょうね。
そもそも、変数 count2 の意味(あるいは使い道)は、何ですか?

Re: FPSについて

Posted: 2012年8月24日(金) 18:04
by Dixq (管理人)
まず前述のお二方質問に回答された上で以下お読み下さい。

もう一度同じことを書きますが、

① 表示されないのは if(ave!=0){ のif文に入らないから。だからどこでaveが変更されているか確認する
② aveが変更されているのは if(count2%60==59){ のif文に入った時。だからcount2の割ったあまりが59になるのはどんな時か確認する
③ count2は宣言されてから変更されていないからaveが変更されず、表示されない

というステップで表示されないことが分かりました。
逆に言えば、③、②、①の処理を順番に見直していけば正常に処理できるように修正出来る可能性があります。
既に前述のお二方も仰っていますが、if(count2%60==59){が何を意味しているのか考えてみましょう。

また、FPSを表示させるうえで、フレームごとに全て時間を測定する必要は実はありません。
例えば60フレームごとに時間を測定し、かかった時間を60で割れば1フレームあたりの処理時間が計算できます。

ゲームプログラミングの館で別の方法を紹介しているので
「特定のFPSで動作させる」
http://dixq.net/g/03_14.html
も参考にして下さい。

Re: FPSについて

Posted: 2012年8月24日(金) 21:49
by Gluek
回答ありがとうございます。順番にこたえていきます


1、ブレークポイントを試したか
試してみたのですが、どこをどう見たらいいのかさっぱり分からなかったです

2、if(count2%60==59)の成立条件
60で割ってあまりがでるとなると・・・119(60+59)・・?

3、どこでC言語を勉強してるのか
図書館で本(コロナ社の)を借りたり、苦C(苦しんで覚えるC言語)で勉強してました

4、count2の使い道
main.cppにもcountを使っていてfpsのほうにcount使っていたら実行時にかぶっていて使えないと警告が出たので
count2という風にしました



今回の問題が解決したら(しなくても)、もう少しsoftyaさんの言うとおり、Cを基礎から学び直してきます。

みなさんありがとうございました

Re: FPSについて

Posted: 2012年8月24日(金) 21:59
by box
Gluek さんが書きました: 4、count2の使い道
main.cppにもcountを使っていてfpsのほうにcount使っていたら実行時にかぶっていて使えないと警告が出たので
count2という風にしました
私の質問の方法があまり適切ではなかったようで、意図がうまく伝わっていないようです。
お聞きしているのは、count2 という変数を何のために使っているか、ということです。
例えば、「テキストファイルの行数を数えるための変数です」のように、
「○○を△△するために使っている」ことを明記していただけないでしょうか。

Re: FPSについて

Posted: 2012年8月24日(金) 22:08
by softya(ソフト屋)
「1、ブレークポイントを試したか」に付いてですが。

ブレークポイントの役目は、
1.プログラムの特定の文をちゃんと通過しているか確認するのに使います。ifやwhileやforのブロックの中など。
2.プログラムの流れとしてその場所を通過した時に変数の値が狙ったものなのかを確認するために使います。
それには頭の中にプログラムの流れと変数の値の変化のしっかりとしたイメージが必要です。
逆によく動きの分からないプログラムをブレークポイントで調べて流れを把握すると言う使い方もあります。

>2、if(count2%60==59)の成立条件
>60で割ってあまりがでるとなると・・・119(60+59)・・?

それだけじゃなく余りが59であればよいので、もっとcount2が別の数字でも一致します。
ただ一致するためにはcount2が変化しなくていはいけませんよね?

全体的にfpsのソースコードの理解が出来ていない気がしますので、一行毎にコメントをするとかはどうでしょうか?
iとtは書きましたので全行をコメントしてみてください。ソースを見て分かることは書かなくて良いのでプログラムの意図を組んで書いてください。

コード:

#include "DxLib.h"
void fps(){
	int i; //ループ用の変数。
    static int t=0,ave=0,f[60];  //t:現在の時間の保存 ave:? f[60]:?

	int count2=0;

	f[count2%60]=GetNowCount()-t;
	t=GetNowCount();
	if(count2%60==59){
		ave=0;
		for(i=0;i<60;i++)
			ave+=f[i];
		ave/=60;
	}
	if(ave!=0){
		DrawFormatString(0, 0,GetColor(255,255,255),"%.1fFPS",1000.0/(double)ave);
		DrawFormatString(0,20,GetColor(255,255,255),"%dms"  ,ave);
	}
	return;
}


void wait_fanc(){
	int term;
	static int t=0;
	term = GetNowCount()-t;
	if(16-term>0)
			Sleep(16-term);
	t=GetNowCount();
	return;
}

Re: FPSについて

Posted: 2012年8月24日(金) 22:18
by Gluek
自分でも漠然と打ち込んでいただけなので

上記に記したとおり、main関数のcountとかぶるのでcount2にしたという感じです

int count2 = .... とやらないと次に書き込むcount2という関数が使えないと自分の頭では認識していたので

理由としてはそんな感じです

Re: FPSについて

Posted: 2012年8月24日(金) 22:26
by box
Gluek さんが書きました: 上記に記したとおり、main関数のcountとかぶるのでcount2にしたという感じです
int count2 = .... とやらないと次に書き込むcount2という関数が使えないと自分の頭では認識していたので
理由としてはそんな感じです
ん~、どうも、こちらの意図がまだ伝わっていないようですね。

そもそも、main関数の count というのは、何をどうするための変数なんでしょうか。
私はゲームプログラミングに全く興味も関心もないのでよくわかっていないのですが、
フレームの番号か何かを格納するための変数なんでしょうか。

fps関数のcount2の役割は、main関数のcountの役割と同じなんでしょうか。
それとも別の役割を持っているのでしょうか。

Re: FPSについて

Posted: 2012年8月24日(金) 22:45
by Gluek
main関数にゲームプログラミングの館にあった当たり判定のサンプルプログラムのソースに使ってます

そこにランダムに2Dの球体を表示するためにcountという関数を用いています

fpsのcount2は、漠然として打ち込んでいたのでこれを使った意図を説明できません。本当にすいません

Re: FPSについて

Posted: 2012年8月24日(金) 23:21
by box
ゲームプログラミングには興味も関心もない者がたわけたことを書いているだけですので、
以下は読み流してくださってもかまいません。

ゲームでも何でもいいんですが、特定のアプリケーションソフトウェアを開発しようとする際、
いきなりコードを書くことから始めるようなことはしない、というのがふつうの方法です。
短いプログラムであれば、いきなりコードを書くことから
始める場合があるかもしれませんが、まあそれはあくまで例外だと思ってください。

ゲームのような、ある程度大きいソフトウェアを開発しようとするのであれば、
コードを書くより前に、これから作ろうとしているソフトウェアはどういうものであるか、というような、
仕様を決めておく(ただし、開発する過程で変わっていく可能性もあり)必要があります。

仕様を決めていく際、メモ書きでも何でもいいですから、
決めた内容を何らかの文書(仕様書とか設計書とかいいます)で見える形にしておくことが
望ましいと思います。頭の中だけであれこれこねくり回してもろくなことがないからです。

外国人向けに書くのでない限り、仕様書とか設計書とかは日本語で書くことになると思います。
ということはですね、今からゲームソフトウェアか何かを作ろうとするのであれば、
まずはそのゲームの仕様を日本語でちゃんと説明できなければ話にならないと思うのです。
日本語で説明できないのに、プログラミング言語という、全く別の世界へ落とし込むことは
まず不可能ではないか、と思います。

今の質問者さんの状態を見ますに、変数 count2 一つとっても、何のために使おうとしているか
うまく説明できていないと思います。
そういう状態で、ゲームソフトウェアを開発しようとするのは、「今の質問者さんにとっては」
ちょっとハードルが高いのではないか、という気がします。そんなことを思っているのは私だけかもしれませんけれど。
C言語を始めて日が浅い、というのがどの程度の期間のことを指すのかわかりませんが、
まずは土台をしっかり固めることの方が、ゲームプログラミングに手を出すより先にすべきことではないかなぁ、
とも思います。

Re: FPSについて

Posted: 2012年8月25日(土) 17:11
by Gluek
softyaさんの言ううとおりに打ち込めたかわかりませんけど。今の自分なりに今日組んでこんな感じになりました

コード:

#include "DxLib.h"
void fps(){
	int i; //ループ用の変数。
	static int t=0,ave=0,f[60];  //t:現在の時間の保存 ave:一回の処理時間平均の保存 f[60]:60回分の計測データの保存

	int count2=0;  //一回の処理で1ずつ増える変数count2の準備

	f[count2%60]=GetNowCount()-t;  //count2を60で割った余りを求める
	t=GetNowCount();  //tをミリ秒単位の精度を持つカウンタに代入
	if(count2%60==59){  //60回目になったら
		ave=0;  //aveを0に代入
		for(i=0;i<60;i++)  //iが60を上回るまでループ
			ave+=f[i];  //aveに加算してf[i]に代入する
		ave/=60;  //aveを60で割って代入する
	}
	if(ave!=0){ //もしもaveが0と等しく無ければ
		DrawFormatString(0, 0,GetColor(255,255,255),"%.1fFPS",1000.0/(double)ave);  //1000から平均で割ってFPSを求める
		DrawFormatString(0,20,GetColor(255,255,255),"%dms"  ,ave);  //aveの値を表記する
	}
	return;  //処理を返す
}


void wait_fanc(){
	int term;  //変数termの準備
	static int t=0;  //現在の時間の保存
	term = GetNowCount()-t;  //termにGetNowCount-tを代入する
	if(16-term>0)  //16ミリ秒より遅ければ
			Sleep(16-term);  //16ミリ秒になるまで休憩
	t=GetNowCount();//tにGetNowCountを代入
	return;//処理を返す
}
	
これでよろしいのでしょうか


boxさん

貴重な文章、本当にありがとうございました
自分は「ゲームを作りたい」という一心だけで少し背伸びをしすぎていたのかもしれません
この問題が解決したら、もう一度C言語の基礎から学び直していきます

Re: FPSについて

Posted: 2012年8月25日(土) 17:34
by softya(ソフト屋)
残念ながら、ほぼ見て分かることを書いていて本質的な意味が書けていません。
問題点を書きましたので考えてみてください。

コード:

#include "DxLib.h"
void fps(){
    int i; //ループ用の変数。
    static int t=0,ave=0,f[60];  //t:現在の時間の保存 ave:一回の処理時間平均の保存 f[60]:60回分の計測データの保存
 
    int count2=0;  //一回の処理で1ずつ増える変数count2の準備
    		→	なぜ0にするかも書いておいてください。それと1づつ増える処理が見当たりません。
 
    f[count2%60]=GetNowCount()-t;  //count2を60で割った余りを求める
    		→	count2%60しか説明していませんし最初に書いた通り見て分かることは書いてはいけません。
    
    t=GetNowCount();  //tをミリ秒単位の精度を持つカウンタに代入
    		→	書いてあるのが実際の動作と逆です。
    if(count2%60==59){  //60回目になったら
    		→	もう少し説明を工夫できませんか?これだとcount2が60の時だけの条件に見えます。
        ave=0;  //aveを0に代入
        	→	なんのために0にするんでしょうか?
        for(i=0;i<60;i++)  //iが60を上回るまでループ
        	→	なぜ60なのでしょうか?
            ave+=f[i];  //aveに加算してf[i]に代入する
        	→	これもf[i]に代入しているのでしょうか? それと見て分かることなので意味を説明してください。
        ave/=60;  //aveを60で割って代入する
        	→	60で割ると何が求まりますか?
    }
    if(ave!=0){ //もしもaveが0と等しく無ければ
        DrawFormatString(0, 0,GetColor(255,255,255),"%.1fFPS",1000.0/(double)ave);  //1000から平均で割ってFPSを求める
        DrawFormatString(0,20,GetColor(255,255,255),"%dms"  ,ave);  //aveの値を表記する
    }
    return;  //処理を返す
}
 
 
void wait_fanc(){
    int term;  //変数termの準備
    static int t=0;  //現在の時間の保存
    term = GetNowCount()-t;  //termにGetNowCount-tを代入する
        	→	この代入にどういう意味がありますか?
    if(16-term>0)  //16ミリ秒より遅ければ
        	→	本当に?
            Sleep(16-term);  //16ミリ秒になるまで休憩
    t=GetNowCount();//tにGetNowCountを代入
        	→	この代入の意味は?
    return;//処理を返す
}

Re: FPSについて

Posted: 2012年8月26日(日) 02:07
by Gluek
すいません・・・必死こいて考えても勉強不足でしてなかなか浮かびません・・・

どうしても分からなかった所には(?)を付けさせていただきました

コード:

#include "DxLib.h"
void fps(){
    int i; //ループ用の変数。
    static int t=0,ave=0,f[60];  //t:現在の時間の保存 ave:一回の処理時間平均の保存 f[60]:60回分の計測データの保存
 
    int count2=0;  //一回の処理で1ずつ増える変数count2の準備
         count2++;
            → なぜ0にするかも書いておいてください。それと1づつ増える処理が見当たりません。(?)
       

    f[count2%60]=GetNowCount()-t;  //count2を60で割った余りを求める
            → count2%60しか説明していませんし最初に書いた通り見て分かることは書いてはいけません。
      count2を60で割った余りを求め、一回の処理で掛かった時間を計測する        

    t=GetNowCount();  //tをミリ秒単位の精度を持つカウンタに代入
            → 書いてあるのが実際の動作と逆です。
     GetNowCountをtに代入

    if(count2%60==59){  //60回目になったら
            → もう少し説明を工夫できませんか?これだとcount2が60の時だけの条件に見えます。
    もしもcount2%60のあまりが59になったら

        ave=0;  //aveを0に代入
            → なんのために0にするんでしょうか?(?)

        for(i=0;i<60;i++)  //iが60を上回るまでループ
            → なぜ60なのでしょうか?
     一回の処理にかかった時間を60回計測するから

            ave+=f[i];  //aveに加算してf[i]に代入する
            → これもf[i]に代入しているのでしょうか? それと見て分かることなので意味を説明してください。(?)

        ave/=60;  //aveを60で割って代入する
            → 60で割ると何が求まりますか?
     60回計測した際の平均
    }
    if(ave!=0){ //もしもaveが0と等しく無ければ
        DrawFormatString(0, 0,GetColor(255,255,255),"%.1fFPS",1000.0/(double)ave);  //1000から平均で割ってFPSを求める
        DrawFormatString(0,20,GetColor(255,255,255),"%dms"  ,ave);  //aveの値を表記する
    }
    return;  //処理を返す
}
 
 
void wait_fanc(){
    int term;  //変数termの準備
    static int t=0;  //現在の時間の保存
    term = GetNowCount()-t;  //termにGetNowCount-tを代入する
            → この代入にどういう意味がありますか?
       現在の時間を取得し、一回の処理にかかった時間を計測する

    if(16-term>0)  //16ミリ秒より遅ければ
            → 本当に?
         16ミリ秒より少なければ


            Sleep(16-term);  //16ミリ秒になるまで休憩

    t=GetNowCount();//tにGetNowCountを代入
            → この代入の意味は?
    現在の時間を取得

    return;//処理を返す
}

Re: FPSについて

Posted: 2012年8月26日(日) 07:10
by へにっくす
softyaさんの、「見て分かることは書かないでください」という意味が分かってませんね。
例を挙げてみましょうか。

コード:

ave+=f[i];  //aveにf[i]を加算する
ave=0; // aveを0に代入
こういうのはコメントに書くまでもなく、見れば分かることですよね。
それとも書かないと忘れちゃう? そんなことないよね。
逆に以下のコメントは、ちゃんと意味が書いてありますね。これは書かないと分からないことですよね。

コード:

int i; //ループ用の変数。
static int t=0,ave=0,f[60];  //t:現在の時間の保存 ave:一回の処理時間平均の保存 f[60]:60回分の計測データの保存
要は、何でもかんでもコメントにする必要はないってこと。
プログラムを組んだとき、どういう処理でそう書いたかをコメントにするべきなのです。
何も考えずにプログラムは組みませんよね?(例にあったから、でもよいのです)
少なくともコードをさらすときは、自分でこういう思いで書いたということをコメントにしてほしいですね。
Gluek さんが書きました:fpsのcount2は、漠然として打ち込んでいたのでこれを使った意図を説明できません。本当にすいません
上のような場合は、、そうですねえ。

コード:

int count2; // まだ使い道はないけど、一応カウント変数
とでも書いとけば、あとは突っ込まれないと思うのですが。(^^;
まあ、必要のない変数は書くなっ!!!とか言われそうですけどね。

Re: FPSについて

Posted: 2012年8月26日(日) 11:32
by softya(ソフト屋)
へにっくすさんが重要なことは書いてくれたので補足的なことだけなのですが、全体的に何故こうしなければいけないのかという感じなこところを書いてもらっていません。
あと全行にコメントを書いてもらっているのは全行を理解して欲しいからです。普段のコメントは数行に一回しか書いちゃダメですよ。

コード:

#include "DxLib.h"
void fps(){
    int i; //ループ用の変数。
    static int t=0,ave=0,f[60];  //t:現在の時間の保存 ave:一回の処理時間平均の保存 f[60]:60回分の計測データの保存
 
    int count2=0;  //一回の処理で1ずつ増える変数count2の準備
         count2++;
            → なぜ0にするかも書いておいてください。それと1づつ増える処理が見当たりません。(?)
            →→ これだと関数が呼び出される度にcount2は0に戻ります。それを++しても答えはわかりますね?
       
 
    f[count2%60]=GetNowCount()-t;  //count2を60で割った余りを求める
            → count2%60しか説明していませんし最初に書いた通り見て分かることは書いてはいけません。
      count2を60で割った余りを求め、一回の処理で掛かった時間を計測する        
            →→ 「count2を60で割った余りを求め」と「一回の処理で掛かった時間を計測する」の説明が繋がっていません。fは何処へ消えましてか?
            →→ それと「一回の処理で掛かった時間を計測する」とありますが、なぜ一回の処理で掛かった時間を計測できるんでしょうか?
 
    t=GetNowCount();  //tをミリ秒単位の精度を持つカウンタに代入
            → 書いてあるのが実際の動作と逆です。
     GetNowCountをtに代入
            →→ 下の方に書いてあること同じ命令なのにコメントが違いますね。より説明が分りやすいのはどちらでしょうか?
            →→ あとここにこの行がなければいけない理由を考えてみましょう。
 
    if(count2%60==59){  //60回目になったら
            → もう少し説明を工夫できませんか?これだとcount2が60の時だけの条件に見えます。
    もしもcount2%60のあまりが59になったら
            →→ それはつまり、どういうことでしょう?
 
        ave=0;  //aveを0に代入
            → なんのために0にするんでしょうか?(?)
            →→ aveは60回計測した際の平均を求めるんですよね? なら、なぜ0なのでしょうか?
 
        for(i=0;i<60;i++)  //iが60を上回るまでループ
            → なぜ60なのでしょうか?
     一回の処理にかかった時間を60回計測するから
            →→ count2%60==59である条件と絡めて説明してみてください。[計測するから]と言う現在形ではないですよ。
 
            ave+=f[i];  //aveに加算してf[i]に代入する
            → これもf[i]に代入しているのでしょうか? それと見て分かることなので意味を説明してください。(?)
            →→ これを行う意図を説明してください。
 
        ave/=60;  //aveを60で割って代入する
            → 60で割ると何が求まりますか?
     60回計測した際の平均
    }
    if(ave!=0){ //もしもaveが0と等しく無ければ
        DrawFormatString(0, 0,GetColor(255,255,255),"%.1fFPS",1000.0/(double)ave);  //1000から平均で割ってFPSを求める
        DrawFormatString(0,20,GetColor(255,255,255),"%dms"  ,ave);  //aveの値を表記する
    }
    return;  //処理を返す
}
 
 
void wait_fanc(){
    int term;  //変数termの準備
    static int t=0;  //現在の時間の保存
    term = GetNowCount()-t;  //termにGetNowCount-tを代入する
            → この代入にどういう意味がありますか?
       現在の時間を取得し、一回の処理にかかった時間を計測する
            →→ 
 
    if(16-term>0)  //16ミリ秒より遅ければ
            → 本当に?
         16ミリ秒より少なければ
 
 
            Sleep(16-term);  //16ミリ秒になるまで休憩
 
    t=GetNowCount();//tにGetNowCountを代入
            → この代入の意味は?
    現在の時間を取得
 
    return;//処理を返す
}

Re: FPSについて

Posted: 2012年8月26日(日) 15:48
by へにっくす
全行コメントすることで、自分で間違いに気づいたりするんですよね
その場合は、こうした方がよいということをコメントに書きましょう

掲示されているソースに書くわけにいかないので、とりあえずサンプル。
平均値を出力しているコードですが、明らかに場所が間違ってますよね?
その場合は、どうすればよいかを後に書きましょう。

コード:

void fps(void)
{
	static int f[60]={0}; // f[60]:60回分の計測データの保存
	int count, ave=0; // count:カウント用変数 ave:平均
	printf("平均:%d", ave); // 平均値の出力 →これはave/=60;の後に行うべき
	for (count = 0; count < 60; count++ ) // fの個数ぶん繰り返す
	{
		ave += f[count]; // 各計測値の加算
	}
	ave /= 60; // 個数で割って、平均値を求める
}

Re: FPSについて

Posted: 2012年8月26日(日) 19:39
by Gluek
ここまでされても分からないってまずいのでしょうか・・・

コード:

#include "DxLib.h"
void fps(){
    int i; //ループ用の変数。
    static int t=0,ave=0,f[60];  //t:現在の時間の保存 ave:一回の処理時間平均の保存 f[60]:60回分の計測データの保存
 
    int count2=0;  //一回の処理で1ずつ増える変数count2の準備
            count++;
            → なぜ0にするかも書いておいてください。それと1づつ増える処理が見当たりません。(?)
            →→ これだと関数が呼び出される度にcount2は0に戻ります。それを++しても答えはわかりますね?
                  なぜ0に戻ってしまうのでしょうか・・・ 
 
    f[count2%60]=GetNowCount()-t;  //count2を60で割った余りを求める
            → count2%60しか説明していませんし最初に書いた通り見て分かることは書いてはいけません。
      count2を60で割った余りを求め、一回の処理で掛かった時間を計測する        
            →→ 「count2を60で割った余りを求め」と「一回の処理で掛かった時間を計測する」の説明が繋がっていません。fは何処へ消えましてか?
            →→ それと「一回の処理で掛かった時間を計測する」とありますが、なぜ一回の処理で掛かった時間を計測できるんでしょうか?(?)
 

    t=GetNowCount();  //tをミリ秒単位の精度を持つカウンタに代入
            → 書いてあるのが実際の動作と逆です。
     GetNowCountをtに代入
            →→ 下の方に書いてあること同じ命令なのにコメントが違いますね。より説明が分りやすいのはどちらでしょうか?
            →→ あとここにこの行がなければいけない理由を考えてみましょう。
         GetNowCountはパソコンが起動した瞬間から今現在にかけて秒数を取得するものなので、現在の時間を代入しなければ計算がおかしくなる 


    if(count2%60==59){  //60回目になったら
            → もう少し説明を工夫できませんか?これだとcount2が60の時だけの条件に見えます。
    もしもcount2%60のあまりが59になったら
            →→ それはつまり、どういうことでしょう?
    何度もfps関数が呼ばれ 60回目に達したら次の60回の計測値の平均を出すステップに移る
 
        ave=0;  //aveを0に代入
            → なんのために0にするんでしょうか?(?)
            →→ aveは60回計測した際の平均を求めるんですよね? なら、なぜ0なのでしょうか?
     あらかじめコンピュータにaveが0であることを宣言しなければならないから
 
        for(i=0;i<60;i++)  //iが60を上回るまでループ
            → なぜ60なのでしょうか?
     一回の処理にかかった時間を60回計測するから
            →→ count2%60==59である条件と絡めて説明してみてください。[計測するから]と言う現在形ではないですよ。
  次の文のiに格納するため60回分の計測値を記す
 
            ave+=f[i];  //aveに加算してf[i]に代入する
            → これもf[i]に代入しているのでしょうか? それと見て分かることなので意味を説明してください。(?)
            →→ これを行う意図を説明してください。
     平均を出すために  60回分の計測時間を全て加算する
 
        ave/=60;  //aveを60で割って代入する
            → 60で割ると何が求まりますか?
     60回計測した際の平均、↑で足した数値を60で割る
    }
    if(ave!=0){ //もしもaveが0と等しく無ければ
        DrawFormatString(0, 0,GetColor(255,255,255),"%.1fFPS",1000.0/(double)ave);  //1000から平均で割ってFPSを求める
        DrawFormatString(0,20,GetColor(255,255,255),"%dms"  ,ave);  //aveの値を表記する
    }
    return;  //処理を返す
}
 
 
void wait_fanc(){
    int term;  //変数termの準備
    static int t=0;  //現在の時間の保存
    term = GetNowCount()-t;  //termにGetNowCount-tを代入する
            → この代入にどういう意味がありますか?
       現在の時間を取得し、一回の処理にかかった時間を計測する
            →→ 
 
    if(16-term>0)  //16ミリ秒より遅ければ
            → 本当に?
         16ミリ秒より少なければ
 
 
            Sleep(16-term);  //16ミリ秒になるまで休憩
 
    t=GetNowCount();//tにGetNowCountを代入
            → この代入の意味は?
    現在の時間を取得
 
    return;//処理を返す
}

まだ理解できない部分があります・・・GetNowCountとはPCが起動してから今に至るまでの経過時間を取得するということで間違いは無いんですよね?

f[60]のfとは何の為にあるものなのでしょうか・・・実数のことをさすんでしょうか・・・

Re: FPSについて

Posted: 2012年8月26日(日) 21:19
by softya(ソフト屋)
初心者なら分からなくても仕方がない部分でもありますがゲームプログラミングを本格的にするためには理解できなくてはいけません。
プログラミングは全部の命令の動作を自分で把握してコンピュータを操る事なのですからね。
なので、C言語の基礎が大事と言うわけです。理論と実践のどちらが掛けてもプログラミングはできません。

あと少しな気もするので頑張りましょう。

コード:

#include "DxLib.h"
void fps(){
    int i; //ループ用の変数。
    static int t=0,ave=0,f[60];  //t:現在の時間の保存 ave:一回の処理時間平均の保存 f[60]:60回分の計測データの保存
 
    int count2=0;  //一回の処理で1ずつ増える変数count2の準備
            count++;
            → なぜ0にするかも書いておいてください。それと1づつ増える処理が見当たりません。(?)
            →→ これだと関数が呼び出される度にcount2は0に戻ります。それを++しても答えはわかりますね?
                  なぜ0に戻ってしまうのでしょうか・・・ 
            →→→ ローカル変数だからです。ローカル変数の寿命は関数を抜けるまでなので、fps()関数を抜けると変数は消滅して、
            →→→ また関数に入った時この行( int count2=0;)が実行される時に再び変数が生成されて0が代入れます。
            →→→ つまり、staticがあるなしで寿命と初期化タイミングが変化します。
 
    f[count2%60]=GetNowCount()-t;  //count2を60で割った余りを求める
            → count2%60しか説明していませんし最初に書いた通り見て分かることは書いてはいけません。
      count2を60で割った余りを求め、一回の処理で掛かった時間を計測する        
            →→ 「count2を60で割った余りを求め」と「一回の処理で掛かった時間を計測する」の説明が繋がっていません。fは何処へ消えましてか?
            →→ それと「一回の処理で掛かった時間を計測する」とありますが、なぜ一回の処理で掛かった時間を計測できるんでしょうか?(?)
            	まだ理解できない部分があります・・・GetNowCountとはPCが起動してから今に至るまでの経過時間を取得するということで間違いは無いんですよね?
            →→→ その通りです。では、GetNowCount()-tの結果は何の値でしょうか?
				f[60]のfとは何の為にあるものなのでしょうか・・・実数のことをさすんでしょうか・・・
            →→→ fは上で定義されてますね。static int t=0,ave=0,f[60];の部分です。配列は分かりますか?
 
 
    t=GetNowCount();  //tをミリ秒単位の精度を持つカウンタに代入
            → 書いてあるのが実際の動作と逆です。
     GetNowCountをtに代入
            →→ 下の方に書いてあること同じ命令なのにコメントが違いますね。より説明が分りやすいのはどちらでしょうか?
            →→ あとここにこの行がなければいけない理由を考えてみましょう。
         GetNowCountはパソコンが起動した瞬間から今現在にかけて秒数を取得するものなので、現在の時間を代入しなければ計算がおかしくなる 
            →→→ ここじゃなければいけない理由は?
 
 
    if(count2%60==59){  //60回目になったら
            → もう少し説明を工夫できませんか?これだとcount2が60の時だけの条件に見えます。
    もしもcount2%60のあまりが59になったら
            →→ それはつまり、どういうことでしょう?
    何度もfps関数が呼ばれ 60回目に達したら次の60回の計測値の平均を出すステップに移る
 
        ave=0;  //aveを0に代入
            → なんのために0にするんでしょうか?(?)
            →→ aveは60回計測した際の平均を求めるんですよね? なら、なぜ0なのでしょうか?
     あらかじめコンピュータにaveが0であることを宣言しなければならないから
            →→→ それは何故でしょう?0じゃないとマズイ理由は?
 
 
        for(i=0;i<60;i++)  //iが60を上回るまでループ
            → なぜ60なのでしょうか?
     一回の処理にかかった時間を60回計測するから
            →→ count2%60==59である条件と絡めて説明してみてください。[計測するから]と言う現在形ではないですよ。
  次の文のiに格納するため60回分の計測値を記す
 
            ave+=f[i];  //aveに加算してf[i]に代入する
            → これもf[i]に代入しているのでしょうか? それと見て分かることなので意味を説明してください。(?)
            →→ これを行う意図を説明してください。
     平均を出すために  60回分の計測時間を全て加算する
 
        ave/=60;  //aveを60で割って代入する
            → 60で割ると何が求まりますか?
     60回計測した際の平均、↑で足した数値を60で割る
    }
    if(ave!=0){ //もしもaveが0と等しく無ければ
        DrawFormatString(0, 0,GetColor(255,255,255),"%.1fFPS",1000.0/(double)ave);  //1000から平均で割ってFPSを求める
        DrawFormatString(0,20,GetColor(255,255,255),"%dms"  ,ave);  //aveの値を表記する
    }
    return;  //処理を返す
}
 
 
void wait_fanc(){
    int term;  //変数termの準備
    static int t=0;  //現在の時間の保存
    term = GetNowCount()-t;  //termにGetNowCount-tを代入する
            → この代入にどういう意味がありますか?
       現在の時間を取得し、一回の処理にかかった時間を計測する
 
    if(16-term>0)  //16ミリ秒より遅ければ
            → 本当に?
         16ミリ秒より少なければ
 
 
            Sleep(16-term);  //16ミリ秒になるまで休憩
 
    t=GetNowCount();//tにGetNowCountを代入
            → この代入の意味は?
    現在の時間を取得
 
    return;//処理を返す
}

Re: FPSについて

Posted: 2012年8月31日(金) 17:54
by Gluek
staticを入れたら正常に表示されました
旧・ゲームプログラミングの館のFPSの項目をもう一度見直してみたら
あれはグローバル変数だったからちゃんと動いていたということですか?

コード:

#include "DxLib.h"
void fps(){
    int i; //ループ用の変数。
    static int t=0,ave=0,f[60];  //t:現在の時間の保存 ave:一回の処理時間平均の保存 f[60]:60回分の計測データの保存
 
    int count2=0;  //一回の処理で1ずつ増える変数count2の準備
            count++;
            → なぜ0にするかも書いておいてください。それと1づつ増える処理が見当たりません。(?)
            →→ これだと関数が呼び出される度にcount2は0に戻ります。それを++しても答えはわかりますね?
                  なぜ0に戻ってしまうのでしょうか・・・ 
            →→→ ローカル変数だからです。ローカル変数の寿命は関数を抜けるまでなので、fps()関数を抜けると変数は消滅して、
            →→→ また関数に入った時この行( int count2=0;)が実行される時に再び変数が生成されて0が代入れます。
            →→→ つまり、staticがあるなしで寿命と初期化タイミングが変化します。
 
    f[count2%60]=GetNowCount()-t;  //count2を60で割った余りを求める
            → count2%60しか説明していませんし最初に書いた通り見て分かることは書いてはいけません。
      count2を60で割った余りを求め、一回の処理で掛かった時間を計測する        
            →→ 「count2を60で割った余りを求め」と「一回の処理で掛かった時間を計測する」の説明が繋がっていません。fは何処へ消えましてか?
            →→ それと「一回の処理で掛かった時間を計測する」とありますが、なぜ一回の処理で掛かった時間を計測できるんでしょうか?(?)
                まだ理解できない部分があります・・・GetNowCountとはPCが起動してから今に至るまでの経過時間を取得するということで間違いは無いんですよね?
            →→→ その通りです。では、GetNowCount()-tの結果は何の値でしょうか?
         現在の時間 tの変数は造られてからまだ操作されてないから

                f[60]のfとは何の為にあるものなのでしょうか・・・実数のことをさすんでしょうか・・・
            →→→ fは上で定義されてますね。static int t=0,ave=0,f[60];の部分です。配列は分かりますか?
 確か同じデータ型を格納する変数をまとめる・・・というのが配列だったような・・・・
 
    t=GetNowCount();  //tをミリ秒単位の精度を持つカウンタに代入
            → 書いてあるのが実際の動作と逆です。
     GetNowCountをtに代入
            →→ 下の方に書いてあること同じ命令なのにコメントが違いますね。より説明が分りやすいのはどちらでしょうか?
            →→ あとここにこの行がなければいけない理由を考えてみましょう。
         GetNowCountはパソコンが起動した瞬間から今現在にかけて秒数を取得するものなので、現在の時間を代入しなければ計算がおかしくなる 
            →→→ ここじゃなければいけない理由は?
     位置をかえてみたら表示されなくなりました
    ・・・現在の時間にPCが起動されてから今に至る経過時間を代入するんですよね?
 
    if(count2%60==59){  //60回目になったら
            → もう少し説明を工夫できませんか?これだとcount2が60の時だけの条件に見えます。
    もしもcount2%60のあまりが59になったら
            →→ それはつまり、どういうことでしょう?
    何度もfps関数が呼ばれ 60回目に達したら次の60回の計測値の平均を出すステップに移る
 
        ave=0;  //aveを0に代入
            → なんのために0にするんでしょうか?(?)
            →→ aveは60回計測した際の平均を求めるんですよね? なら、なぜ0なのでしょうか?
     あらかじめコンピュータにaveが0であることを宣言しなければならないから
            →→→ それは何故でしょう?0じゃないとマズイ理由は?
 
 
        for(i=0;i<60;i++)  //iが60を上回るまでループ
            → なぜ60なのでしょうか?
     一回の処理にかかった時間を60回計測するから
            →→ count2%60==59である条件と絡めて説明してみてください。[計測するから]と言う現在形ではないですよ。
  次の文のiに格納するため60回分の計測値を記す
 
            ave+=f[i];  //aveに加算してf[i]に代入する
            → これもf[i]に代入しているのでしょうか? それと見て分かることなので意味を説明してください。(?)
            →→ これを行う意図を説明してください。
     平均を出すために  60回分の計測時間を全て加算する
 
        ave/=60;  //aveを60で割って代入する
            → 60で割ると何が求まりますか?
     60回計測した際の平均、↑で足した数値を60で割る
    }
    if(ave!=0){ //もしもaveが0と等しく無ければ
        DrawFormatString(0, 0,GetColor(255,255,255),"%.1fFPS",1000.0/(double)ave);  //1000から平均で割ってFPSを求める
        DrawFormatString(0,20,GetColor(255,255,255),"%dms"  ,ave);  //aveの値を表記する
    }
    return;  //処理を返す
}
 
 
void wait_fanc(){
    int term;  //変数termの準備
    static int t=0;  //現在の時間の保存
    term = GetNowCount()-t;  //termにGetNowCount-tを代入する
            → この代入にどういう意味がありますか?
       現在の時間を取得し、一回の処理にかかった時間を計測する
 
    if(16-term>0)  //16ミリ秒より遅ければ
            → 本当に?
         16ミリ秒より少なければ
 
 
            Sleep(16-term);  //16ミリ秒になるまで休憩
 
    t=GetNowCount();//tにGetNowCountを代入
            → この代入の意味は?
    現在の時間を取得
 
    return;//処理を返す
}
当初の問題は解決しましたが、まだ全文の理解が済んでないので解決は押さずこのまま続けたいと思います

Re: FPSについて

Posted: 2012年8月31日(金) 21:46
by softya(ソフト屋)
なんかごちゃごちゃしてきましたから、書きなおしましょうか。
つまり、途中経過や私の書いたものは消してGluekさんの最新のコメントだけにしてください。
今の時点で分からない事はコメントに書いてください。

不安な点はプログラムの時系列についての理解が出来ていない気がします。
fps()関数は1/60秒周期で何度も呼び出されますので、変数の内容は前回の結果と今回の状況で変化してきます。
そこの部分を明確にコメントに書いてください。

例えば「現在の時間 tの変数は造られてからまだ操作されてないから」これはfps()関数が初めて呼ばれた時だけの話です。
2回目はどうですか?3回目は? そういう視点に立って考えてみてください。

Re: FPSについて

Posted: 2012年9月07日(金) 10:22
by Gluek

コード:

#include <DxLib.h>

void fps();

static int ave=0 t=0 f[60];  // ave=時間平均 t=現在の時間 f=計測結果の格納
static int count2=0; // 増える変数
count2++; //増やしてる

f[count2%60]=GetNowCount(); //  ?????????????
t=GetNowCount; // ここにこの行がなければいけない理由

  if(count2%60==59){  //60回目に達したら次のステップに移る
  ave=0;  //なぜ0にしなければいけないのか(?)
  for(i=0;i<60;i++) // 何度もfps関数が呼ばれて 60回目に達したら次のステップに移る
  ave+=f[i]; //上で計測した値を合計する
  ave/=60;  //平均を出すためのそれを割る
  }
if(ave!=0) //もしもaveの値が0と等しくなかったら
DrawFormatString(0, 0,GetColor(255,255,255),"%.1fFPS",1000.0/(double)ave);//表記
DrawFormatString(0,20,GetColor(255,255,255),"%dms" ,ave);//表記
   }
          return;  //処理を返す
   }


void wait_fanc(){
	int term; //term の 変数	
	static int t=0; //  時間の保存
	term = GetNowCount()-t; //現在の時間を取得し、一回の処理にかかった時間を計測
	if(16-term>0)  //16ミリより少なければ
	Sleep(16-term); //お休み
	t=GetNowCount();//現在の時間を取得
	return;  //処理を返す
	}


一応 わからないところを書きました
未だにさっぱりなところもあるので教えていただけたらうれしいです

Re: FPSについて

Posted: 2012年9月07日(金) 11:25
by softya(ソフト屋)
プログラムが変わってしまっています。見なおしてみてください。
あとインデントが狂っているので補正をお願いします。

Re: FPSについて

Posted: 2012年9月07日(金) 20:28
by Gluek

コード:

#include <DxLib.h>
 
void fps(){ 
        int i=0; //ループ専用の変数
        static int ave=0 t=0 f[60];  // ave=時間平均 t=現在の時間 f=計測結果の格納
        static int count2=0; // 増える変数
        count2++; //増やしてる
 
        f[count2%60]=GetNowCount(); //  ?????????????
        t=GetNowCount; // ここにこの行がなければいけない理由
      if(count2%60==59){  //60回目に達したら次のステップに移る
            ave=0;  //なぜ0にしなければいけないのか(?)
            for(i=0;i<60;i++) // 何度もfps関数が呼ばれて 60回目に達したら次のステップに移る
                  ave+=f[i]; //上で計測した値を合計する
            ave/=60;  //平均を出すためのそれを割る
        }
           if(ave!=0) //もしもaveの値が0と等しくなかったら
                DrawFormatString(0, 0,GetColor(255,255,255),"%.1fFPS",1000.0/(double)ave);//表記
                DrawFormatString(0,20,GetColor(255,255,255),"%dms" ,ave);//表記
       }
           return;  //処理を返す
}
 
 
void wait_fanc(){
      int term; //term の 変数 
      static int t=0; //  時間の保存
      term = GetNowCount()-t; //現在の時間を取得し、一回の処理にかかった時間を計測
      if(16-term>0)  //16ミリより少なければ
                 Sleep(16-term); //お休み
      t=GetNowCount();//現在の時間を取得
      return;  //処理を返す
}

本当にすいません うっかりしてました

Re: FPSについて

Posted: 2012年9月07日(金) 20:38
by Dixq (管理人)
上のコードはコンパイル通りませんよね。
机の上で考えるより、ドンドン自分でプログラムコードを書いてコンパイルしていった方が覚えるのが早いですよ。
人のコードを理解するのが難しいなら自分で書いてみてはどうでしょう。
まずは、「60フレーム分の時間を計測してその時間を表示する」から始めたら案外あっさり出来るかもしれません。
それが出来れば後は60で割ればいいだけなので。

Re: FPSについて

Posted: 2012年9月08日(土) 09:48
by softya(ソフト屋)
Dixq (管理人)さんの提案どおりにした方が良いかもしれません。
20:28に再投稿してもらったコードもインデントは直っていますがプログラムとして元と変わってしまって色々とバグっています。
それに気づいていない様ですので1命令毎の動作がほんとにイメージできていないんだと思います。
これと同じ機能のコードを1から作るのがよいでしょう。

Re: FPSについて

Posted: 2012年9月08日(土) 19:12
by Gluek

コード:

#include "DxLib.h"
void fps(){
	int i; //ループ用の変数。
	static int t=0,ave=0,f[60],count2=0;  //t:現在の時間の保存 ave:一回の処理時間平均の保存 f[60]:60回分の計測データの保存
	count2++;

	f[count2%60]=GetNowCount()-t;  
	t=GetNowCount();
	if(count2%60==59){  
		ave=0;  
		for(i=0;i<60;i++)  
			ave+=f[i];  
		ave/=60;  
	}
	if(ave!=0){ 
		DrawFormatString(0, 0,GetColor(255,255,255),"%.1fFPS",1000.0/(double)ave);  
		DrawFormatString(0,20,GetColor(255,255,255),"%dms"  ,ave);  
	}
	return;  
}


void wait_fanc(){
	int term;  
	static int t=0;  
	term = GetNowCount()-t;
	if(16-term>0)
			Sleep(16-term);
	t=GetNowCount();
	return;
}
	

一から全部打ち直してコンパイルもちゃんと通せました

これで良いのでしょうか・・?

Re: FPSについて

Posted: 2012年9月08日(土) 19:19
by softya(ソフト屋)
打ち直すだけなく、何処が間違っていたか分かりますか?
それとDixq (管理人) さんの提案は、同じ機能の物を自分で書くということです。

Re: FPSについて

Posted: 2012年9月09日(日) 01:49
by Gluek
恐らく7行目の文

f[count2%60]=GetNowcount();

で-tが抜けていたので

f[count2%60]=GetNouCount()-t;



にしたら直ったんだとおもいます



おなじシステムと言うのは

↓の文と同じではないが機能は同じである物を打ち込むことでいいのでしょうか?

Re: FPSについて

Posted: 2012年9月09日(日) 09:20
by へにっくす
Gluek さんが書きました:恐らく7行目の文

f[count2%60]=GetNowcount();

で-tが抜けていたので

f[count2%60]=GetNouCount()-t;



にしたら直ったんだとおもいます
あと全角スペースが混じってましたね。
コーディングするときは気をつけましょうね。
Gluek さんが書きました:おなじシステムと言うのは

↓の文と同じではないが機能は同じである物を打ち込むことでいいのでしょうか?
そうでいいと思いますけど
再度コードを載せるときは、
WinMain関数も含めましょうね
fps関数、wait_fanc関数をどのように呼んでるのかも気になるからね。。

Re: FPSについて

Posted: 2012年9月09日(日) 16:48
by softya(ソフト屋)
こういうプログラムでやっていることは、現実生活では可能なことがプログラムを書くことになると出来なくなる人が多いですよね。

例えばf[count2%60]=GetNouCount()-t;は経過時間を測るに関わりますが、現実世界で普通の腕時計しか持っていないとして経過時間を測り続けるとしたらどうしますか?
そうですね。腕時計でレースでバイクが周回しているとしてそれぞれの周回のタイムを測るとしたらどうするでしょう?
プログラムで行き詰まっているなら、この方法を手順として書いてみてください。

Re: FPSについて

Posted: 2012年9月10日(月) 23:27
by Gluek
すみません、プログラムは組んでいる途中なんですがいくつか質問をさせてください

一つ目の質問は質問というより確認なんですけど

例えば適当な距離を3周するときに一周どれくらいのタイムで回るかをはかるときに


一回目

経過した時間

二回目

経過した時間-前回の経過時間






という風にすれば3周目以降も難なく計測できるわけですよね?
f[count2%60]=GetNouCount()-t; とは↑の事と同じことをしているわけですか?


二つ目はt=GetNowCount();の位置がどうしてあそこじゃなくてはいけないのかいまいち掴めないのです


経過時間を先に取得するのと後で取得するのとは何が違うんでしょうか?

教えていただけたら嬉しいです

Re: FPSについて

Posted: 2012年9月10日(月) 23:51
by softya(ソフト屋)
経過した時間は今の時計の指す時間と考えてもらって良いでしょう。

>経過時間を先に取得するのと後で取得するのとは何が違うんでしょうか?

時計を今見ると後で見るのとでは意味が違いますよね。それと同じです。

Re: FPSについて

Posted: 2012年9月12日(水) 14:56
by Gluek
うーん・・・・


すいません、いまいちよく理解できません・・・



確かに後でみるのと今みるのとでは違うと思いますが

それがあのプログラムと何の関係があるのでしょうか?

Re: FPSについて

Posted: 2012年9月12日(水) 15:09
by softya(ソフト屋)
Gluek さんが書きました:うーん・・・・


すいません、いまいちよく理解できません・・・



確かに後でみるのと今みるのとでは違うと思いますが

それがあのプログラムと何の関係があるのでしょうか?
分かりやすく時計の時間で説明しますが実際はミリ秒単位です。

tは時間のメモでtのメモ内容と今の時計との時間差が経過時間ですよね。
tが5時3分5秒で今の時計が5時3分15秒なら10秒の経過です。
つまりtにメモってから今の時計を見るまでが経過時間って事です。

ここでメモるのが遅れて5時3分6秒にtをメモしたとします。そうするとtが5時3分6秒で今の時計が5時3分15秒だと9秒の経過となりますね。
でもちゃんと計測した場合10秒計経過しているので計測は間違いがあることになります。
tのメモが遅れるのは良くないよって例です。

Re: FPSについて

Posted: 2012年9月17日(月) 16:11
by Gluek
流れは把握できました

時間にズレが生じて正確な計算ができなくなるのであそこじゃないとだめなんですね



(多分)最後の質問になると思うんですが


ave=0が0じゃないといけない理由について・・・


aveの変数がstaticで保存されてるので一度0にしないと前回の数値がそのまま残った状態で計算されるから


と、考え付いたのですが


これで合っているのでしょうか?

Re: FPSについて

Posted: 2012年9月17日(月) 16:26
by softya(ソフト屋)
それで合っています。

ただ、大体理解できたと思われていると思いますがサンプルを見ずに同じ物が書けないと真に理解したことにはならないのです。
なので、Dixq (管理人)さんの言われる同じ物を作ってみるは実に理にかなった勉強方法です。
今でなくても良いので、ぜひ挑戦してみてください。

Re: FPSについて

Posted: 2012年9月17日(月) 16:31
by Gluek
やっと解決したんだと思います。



そのためのプログラムも頑張って今造っています。



これからもがんばります。



回答していただいた皆さん本当にありがとうございました