FPSについて
-
Gluek
FPSについて
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
現在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について
毎フレーム分の時間を60で割ってしまっているので、
計算上16fps以下に落ちないとif(avg!=0)により表示されないと思います。
嘘です。ごめんなさい。
このような誤解を産まないために、コードはcodeタグで囲んでください。
計算上16fps以下に落ちないとif(avg!=0)により表示されないと思います。
嘘です。ごめんなさい。
このような誤解を産まないために、コードはcodeタグで囲んでください。
最後に編集したユーザー みけCAT on 2012年8月19日(日) 22:27 [ 編集 2 回目 ]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: FPSについて
fps() を実行するたびに、変数 count2 をゼロで初期化していて、
値を変更しているような形跡がありません。
大丈夫なんでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 15年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: FPSについて
何故表示されないのか、コードから考えてみましょう。
まず、表示を行っているのは
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;
から変更されているように見えません。
従って表示されないのでしょう。
このように何故動作しないのか、理由を考えていけばわかると思います。
また、複雑で一見分からない時は、ブレイクポイントを置いて確認していくと分かりやすいです。
まず、表示を行っているのは
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;
から変更されているように見えません。
従って表示されないのでしょう。
このように何故動作しないのか、理由を考えていけばわかると思います。
また、複雑で一見分からない時は、ブレイクポイントを置いて確認していくと分かりやすいです。
-
Gluek
Re: FPSについて
みなさん返答ありがとうございます
あれから二日間必死にいろいろ策を講じました
count2を1にしたりやってみたのですが全く表示されませんでした
数値を変える処理というのは具体的にどのような処理をすればよいのでしょうか?
あとあのプログラムだと表示はされてないけどちゃんとfpsは計算できているのでしょうか?
どうか、もう少しヒントを出していただければと思います
あれから二日間必死にいろいろ策を講じました
count2を1にしたりやってみたのですが全く表示されませんでした
数値を変える処理というのは具体的にどのような処理をすればよいのでしょうか?
あとあのプログラムだと表示はされてないけどちゃんとfpsは計算できているのでしょうか?
どうか、もう少しヒントを出していただければと思います
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: FPSについて
読み辛くなるので改行を減らしてもらえると嬉しいです。
いくつかお聞きします。
1) Dixq (管理人)さんも書いていますが、ブレークポイントは試されましたか?
2) if(count2%60==59)という条件は成立するのはどういう場合でしょう?
色々悩まれたとは思いますが、根本的な問題はC言語の基本的なことが理解できていないことだと思います。
なので、
3) どんなサイトや書籍でC言語の入門の勉強をされていますか?
をお聞きしたいです。
いくつかお聞きします。
1) Dixq (管理人)さんも書いていますが、ブレークポイントは試されましたか?
2) if(count2%60==59)という条件は成立するのはどういう場合でしょう?
色々悩まれたとは思いますが、根本的な問題はC言語の基本的なことが理解できていないことだと思います。
なので、
3) どんなサイトや書籍でC言語の入門の勉強をされていますか?
をお聞きしたいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: FPSについて
意味をわからずに、そういうことだけしてもダメでしょうね。Gluek さんが書きました: count2を1にしたりやってみたのですが全く表示されませんでした
そもそも、変数 count2 の意味(あるいは使い道)は、何ですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 15年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: FPSについて
まず前述のお二方質問に回答された上で以下お読み下さい。
もう一度同じことを書きますが、
① 表示されないのは 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
も参考にして下さい。
もう一度同じことを書きますが、
① 表示されないのは 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
も参考にして下さい。
-
Gluek
Re: FPSについて
回答ありがとうございます。順番にこたえていきます
1、ブレークポイントを試したか
試してみたのですが、どこをどう見たらいいのかさっぱり分からなかったです
2、if(count2%60==59)の成立条件
60で割ってあまりがでるとなると・・・119(60+59)・・?
3、どこでC言語を勉強してるのか
図書館で本(コロナ社の)を借りたり、苦C(苦しんで覚えるC言語)で勉強してました
4、count2の使い道
main.cppにもcountを使っていてfpsのほうにcount使っていたら実行時にかぶっていて使えないと警告が出たので
count2という風にしました
今回の問題が解決したら(しなくても)、もう少しsoftyaさんの言うとおり、Cを基礎から学び直してきます。
みなさんありがとうございました
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について
私の質問の方法があまり適切ではなかったようで、意図がうまく伝わっていないようです。Gluek さんが書きました: 4、count2の使い道
main.cppにもcountを使っていてfpsのほうにcount使っていたら実行時にかぶっていて使えないと警告が出たので
count2という風にしました
お聞きしているのは、count2 という変数を何のために使っているか、ということです。
例えば、「テキストファイルの行数を数えるための変数です」のように、
「○○を△△するために使っている」ことを明記していただけないでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: FPSについて
「1、ブレークポイントを試したか」に付いてですが。
ブレークポイントの役目は、
1.プログラムの特定の文をちゃんと通過しているか確認するのに使います。ifやwhileやforのブロックの中など。
2.プログラムの流れとしてその場所を通過した時に変数の値が狙ったものなのかを確認するために使います。
それには頭の中にプログラムの流れと変数の値の変化のしっかりとしたイメージが必要です。
逆によく動きの分からないプログラムをブレークポイントで調べて流れを把握すると言う使い方もあります。
>2、if(count2%60==59)の成立条件
>60で割ってあまりがでるとなると・・・119(60+59)・・?
それだけじゃなく余りが59であればよいので、もっとcount2が別の数字でも一致します。
ただ一致するためにはcount2が変化しなくていはいけませんよね?
全体的にfpsのソースコードの理解が出来ていない気がしますので、一行毎にコメントをするとかはどうでしょうか?
iとtは書きましたので全行をコメントしてみてください。ソースを見て分かることは書かなくて良いのでプログラムの意図を組んで書いてください。
ブレークポイントの役目は、
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;
}by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
Gluek
Re: FPSについて
自分でも漠然と打ち込んでいただけなので
上記に記したとおり、main関数のcountとかぶるのでcount2にしたという感じです
int count2 = .... とやらないと次に書き込むcount2という関数が使えないと自分の頭では認識していたので
理由としてはそんな感じです
上記に記したとおり、main関数のcountとかぶるのでcount2にしたという感じです
int count2 = .... とやらないと次に書き込むcount2という関数が使えないと自分の頭では認識していたので
理由としてはそんな感じです
Re: FPSについて
ん~、どうも、こちらの意図がまだ伝わっていないようですね。Gluek さんが書きました: 上記に記したとおり、main関数のcountとかぶるのでcount2にしたという感じです
int count2 = .... とやらないと次に書き込むcount2という関数が使えないと自分の頭では認識していたので
理由としてはそんな感じです
そもそも、main関数の count というのは、何をどうするための変数なんでしょうか。
私はゲームプログラミングに全く興味も関心もないのでよくわかっていないのですが、
フレームの番号か何かを格納するための変数なんでしょうか。
fps関数のcount2の役割は、main関数のcountの役割と同じなんでしょうか。
それとも別の役割を持っているのでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
-
Gluek
Re: FPSについて
main関数にゲームプログラミングの館にあった当たり判定のサンプルプログラムのソースに使ってます
そこにランダムに2Dの球体を表示するためにcountという関数を用いています
fpsのcount2は、漠然として打ち込んでいたのでこれを使った意図を説明できません。本当にすいません
そこにランダムに2Dの球体を表示するためにcountという関数を用いています
fpsのcount2は、漠然として打ち込んでいたのでこれを使った意図を説明できません。本当にすいません
Re: FPSについて
ゲームプログラミングには興味も関心もない者がたわけたことを書いているだけですので、
以下は読み流してくださってもかまいません。
ゲームでも何でもいいんですが、特定のアプリケーションソフトウェアを開発しようとする際、
いきなりコードを書くことから始めるようなことはしない、というのがふつうの方法です。
短いプログラムであれば、いきなりコードを書くことから
始める場合があるかもしれませんが、まあそれはあくまで例外だと思ってください。
ゲームのような、ある程度大きいソフトウェアを開発しようとするのであれば、
コードを書くより前に、これから作ろうとしているソフトウェアはどういうものであるか、というような、
仕様を決めておく(ただし、開発する過程で変わっていく可能性もあり)必要があります。
仕様を決めていく際、メモ書きでも何でもいいですから、
決めた内容を何らかの文書(仕様書とか設計書とかいいます)で見える形にしておくことが
望ましいと思います。頭の中だけであれこれこねくり回してもろくなことがないからです。
外国人向けに書くのでない限り、仕様書とか設計書とかは日本語で書くことになると思います。
ということはですね、今からゲームソフトウェアか何かを作ろうとするのであれば、
まずはそのゲームの仕様を日本語でちゃんと説明できなければ話にならないと思うのです。
日本語で説明できないのに、プログラミング言語という、全く別の世界へ落とし込むことは
まず不可能ではないか、と思います。
今の質問者さんの状態を見ますに、変数 count2 一つとっても、何のために使おうとしているか
うまく説明できていないと思います。
そういう状態で、ゲームソフトウェアを開発しようとするのは、「今の質問者さんにとっては」
ちょっとハードルが高いのではないか、という気がします。そんなことを思っているのは私だけかもしれませんけれど。
C言語を始めて日が浅い、というのがどの程度の期間のことを指すのかわかりませんが、
まずは土台をしっかり固めることの方が、ゲームプログラミングに手を出すより先にすべきことではないかなぁ、
とも思います。
以下は読み流してくださってもかまいません。
ゲームでも何でもいいんですが、特定のアプリケーションソフトウェアを開発しようとする際、
いきなりコードを書くことから始めるようなことはしない、というのがふつうの方法です。
短いプログラムであれば、いきなりコードを書くことから
始める場合があるかもしれませんが、まあそれはあくまで例外だと思ってください。
ゲームのような、ある程度大きいソフトウェアを開発しようとするのであれば、
コードを書くより前に、これから作ろうとしているソフトウェアはどういうものであるか、というような、
仕様を決めておく(ただし、開発する過程で変わっていく可能性もあり)必要があります。
仕様を決めていく際、メモ書きでも何でもいいですから、
決めた内容を何らかの文書(仕様書とか設計書とかいいます)で見える形にしておくことが
望ましいと思います。頭の中だけであれこれこねくり回してもろくなことがないからです。
外国人向けに書くのでない限り、仕様書とか設計書とかは日本語で書くことになると思います。
ということはですね、今からゲームソフトウェアか何かを作ろうとするのであれば、
まずはそのゲームの仕様を日本語でちゃんと説明できなければ話にならないと思うのです。
日本語で説明できないのに、プログラミング言語という、全く別の世界へ落とし込むことは
まず不可能ではないか、と思います。
今の質問者さんの状態を見ますに、変数 count2 一つとっても、何のために使おうとしているか
うまく説明できていないと思います。
そういう状態で、ゲームソフトウェアを開発しようとするのは、「今の質問者さんにとっては」
ちょっとハードルが高いのではないか、という気がします。そんなことを思っているのは私だけかもしれませんけれど。
C言語を始めて日が浅い、というのがどの程度の期間のことを指すのかわかりませんが、
まずは土台をしっかり固めることの方が、ゲームプログラミングに手を出すより先にすべきことではないかなぁ、
とも思います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
-
Gluek
Re: FPSについて
softyaさんの言ううとおりに打ち込めたかわかりませんけど。今の自分なりに今日組んでこんな感じになりました
これでよろしいのでしょうか
boxさん
貴重な文章、本当にありがとうございました
自分は「ゲームを作りたい」という一心だけで少し背伸びをしすぎていたのかもしれません
この問題が解決したら、もう一度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の準備
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言語の基礎から学び直していきます
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 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の準備
→ なぜ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;//処理を返す
}by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
Gluek
Re: 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の準備
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について
softyaさんの、「見て分かることは書かないでください」という意味が分かってませんね。
例を挙げてみましょうか。 こういうのはコメントに書くまでもなく、見れば分かることですよね。
それとも書かないと忘れちゃう? そんなことないよね。
逆に以下のコメントは、ちゃんと意味が書いてありますね。これは書かないと分からないことですよね。
要は、何でもかんでもコメントにする必要はないってこと。
プログラムを組んだとき、どういう処理でそう書いたかをコメントにするべきなのです。
何も考えずにプログラムは組みませんよね?(例にあったから、でもよいのです)
少なくともコードをさらすときは、自分でこういう思いで書いたということをコメントにしてほしいですね。
まあ、必要のない変数は書くなっ!!!とか言われそうですけどね。
例を挙げてみましょうか。 こういうのはコメントに書くまでもなく、見れば分かることですよね。
それとも書かないと忘れちゃう? そんなことないよね。
逆に以下のコメントは、ちゃんと意味が書いてありますね。これは書かないと分からないことですよね。
int i; //ループ用の変数。
static int t=0,ave=0,f[60]; //t:現在の時間の保存 ave:一回の処理時間平均の保存 f[60]:60回分の計測データの保存プログラムを組んだとき、どういう処理でそう書いたかをコメントにするべきなのです。
何も考えずにプログラムは組みませんよね?(例にあったから、でもよいのです)
少なくともコードをさらすときは、自分でこういう思いで書いたということをコメントにしてほしいですね。
上のような場合は、、そうですねえ。 とでも書いとけば、あとは突っ込まれないと思うのですが。(^^;Gluek さんが書きました:fpsのcount2は、漠然として打ち込んでいたのでこれを使った意図を説明できません。本当にすいません
まあ、必要のない変数は書くなっ!!!とか言われそうですけどね。
最後に編集したユーザー へにっくす on 2012年8月26日(日) 14:57 [ 編集 1 回目 ]
written by へにっくす
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 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の準備
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;//処理を返す
}by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: FPSについて
全行コメントすることで、自分で間違いに気づいたりするんですよね
その場合は、こうした方がよいということをコメントに書きましょう
掲示されているソースに書くわけにいかないので、とりあえずサンプル。
平均値を出力しているコードですが、明らかに場所が間違ってますよね?
その場合は、どうすればよいかを後に書きましょう。
その場合は、こうした方がよいということをコメントに書きましょう
掲示されているソースに書くわけにいかないので、とりあえずサンプル。
平均値を出力しているコードですが、明らかに場所が間違ってますよね?
その場合は、どうすればよいかを後に書きましょう。
written by へにっくす
-
Gluek
Re: FPSについて
ここまでされても分からないってまずいのでしょうか・・・
まだ理解できない部分があります・・・GetNowCountとはPCが起動してから今に至るまでの経過時間を取得するということで間違いは無いんですよね?
f[60]のfとは何の為にあるものなのでしょうか・・・実数のことをさすんでしょうか・・・
#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とは何の為にあるものなのでしょうか・・・実数のことをさすんでしょうか・・・
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: FPSについて
初心者なら分からなくても仕方がない部分でもありますがゲームプログラミングを本格的にするためには理解できなくてはいけません。
プログラミングは全部の命令の動作を自分で把握してコンピュータを操る事なのですからね。
なので、C言語の基礎が大事と言うわけです。理論と実践のどちらが掛けてもプログラミングはできません。
あと少しな気もするので頑張りましょう。
プログラミングは全部の命令の動作を自分で把握してコンピュータを操る事なのですからね。
なので、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;//処理を返す
}by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
Gluek
Re: FPSについて
staticを入れたら正常に表示されました
旧・ゲームプログラミングの館のFPSの項目をもう一度見直してみたら
あれはグローバル変数だったからちゃんと動いていたということですか?
当初の問題は解決しましたが、まだ全文の理解が済んでないので解決は押さずこのまま続けたいと思います
旧・ゲームプログラミングの館の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;//処理を返す
}- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: FPSについて
なんかごちゃごちゃしてきましたから、書きなおしましょうか。
つまり、途中経過や私の書いたものは消してGluekさんの最新のコメントだけにしてください。
今の時点で分からない事はコメントに書いてください。
不安な点はプログラムの時系列についての理解が出来ていない気がします。
fps()関数は1/60秒周期で何度も呼び出されますので、変数の内容は前回の結果と今回の状況で変化してきます。
そこの部分を明確にコメントに書いてください。
例えば「現在の時間 tの変数は造られてからまだ操作されてないから」これはfps()関数が初めて呼ばれた時だけの話です。
2回目はどうですか?3回目は? そういう視点に立って考えてみてください。
つまり、途中経過や私の書いたものは消してGluekさんの最新のコメントだけにしてください。
今の時点で分からない事はコメントに書いてください。
不安な点はプログラムの時系列についての理解が出来ていない気がします。
fps()関数は1/60秒周期で何度も呼び出されますので、変数の内容は前回の結果と今回の状況で変化してきます。
そこの部分を明確にコメントに書いてください。
例えば「現在の時間 tの変数は造られてからまだ操作されてないから」これはfps()関数が初めて呼ばれた時だけの話です。
2回目はどうですか?3回目は? そういう視点に立って考えてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
Gluek
Re: FPSについて
#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; //処理を返す
}一応 わからないところを書きました
未だにさっぱりなところもあるので教えていただけたらうれしいです
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: FPSについて
プログラムが変わってしまっています。見なおしてみてください。
あとインデントが狂っているので補正をお願いします。
あとインデントが狂っているので補正をお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
Gluek
Re: FPSについて
#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; //処理を返す
}本当にすいません うっかりしてました
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 15年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: FPSについて
上のコードはコンパイル通りませんよね。
机の上で考えるより、ドンドン自分でプログラムコードを書いてコンパイルしていった方が覚えるのが早いですよ。
人のコードを理解するのが難しいなら自分で書いてみてはどうでしょう。
まずは、「60フレーム分の時間を計測してその時間を表示する」から始めたら案外あっさり出来るかもしれません。
それが出来れば後は60で割ればいいだけなので。
机の上で考えるより、ドンドン自分でプログラムコードを書いてコンパイルしていった方が覚えるのが早いですよ。
人のコードを理解するのが難しいなら自分で書いてみてはどうでしょう。
まずは、「60フレーム分の時間を計測してその時間を表示する」から始めたら案外あっさり出来るかもしれません。
それが出来れば後は60で割ればいいだけなので。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: FPSについて
Dixq (管理人)さんの提案どおりにした方が良いかもしれません。
20:28に再投稿してもらったコードもインデントは直っていますがプログラムとして元と変わってしまって色々とバグっています。
それに気づいていない様ですので1命令毎の動作がほんとにイメージできていないんだと思います。
これと同じ機能のコードを1から作るのがよいでしょう。
20:28に再投稿してもらったコードもインデントは直っていますがプログラムとして元と変わってしまって色々とバグっています。
それに気づいていない様ですので1命令毎の動作がほんとにイメージできていないんだと思います。
これと同じ機能のコードを1から作るのがよいでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
Gluek
Re: FPSについて
#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;
}
一から全部打ち直してコンパイルもちゃんと通せました
これで良いのでしょうか・・?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: FPSについて
打ち直すだけなく、何処が間違っていたか分かりますか?
それとDixq (管理人) さんの提案は、同じ機能の物を自分で書くということです。
それとDixq (管理人) さんの提案は、同じ機能の物を自分で書くということです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
Gluek
Re: FPSについて
恐らく7行目の文
f[count2%60]=GetNowcount();
で-tが抜けていたので
f[count2%60]=GetNouCount()-t;
にしたら直ったんだとおもいます
おなじシステムと言うのは
↓の文と同じではないが機能は同じである物を打ち込むことでいいのでしょうか?
f[count2%60]=GetNowcount();
で-tが抜けていたので
f[count2%60]=GetNouCount()-t;
にしたら直ったんだとおもいます
おなじシステムと言うのは
↓の文と同じではないが機能は同じである物を打ち込むことでいいのでしょうか?
Re: FPSについて
あと全角スペースが混じってましたね。Gluek さんが書きました:恐らく7行目の文
f[count2%60]=GetNowcount();
で-tが抜けていたので
f[count2%60]=GetNouCount()-t;
にしたら直ったんだとおもいます
コーディングするときは気をつけましょうね。
そうでいいと思いますけどGluek さんが書きました:おなじシステムと言うのは
↓の文と同じではないが機能は同じである物を打ち込むことでいいのでしょうか?
再度コードを載せるときは、
WinMain関数も含めましょうね
fps関数、wait_fanc関数をどのように呼んでるのかも気になるからね。。
written by へにっくす
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: FPSについて
こういうプログラムでやっていることは、現実生活では可能なことがプログラムを書くことになると出来なくなる人が多いですよね。
例えばf[count2%60]=GetNouCount()-t;は経過時間を測るに関わりますが、現実世界で普通の腕時計しか持っていないとして経過時間を測り続けるとしたらどうしますか?
そうですね。腕時計でレースでバイクが周回しているとしてそれぞれの周回のタイムを測るとしたらどうするでしょう?
プログラムで行き詰まっているなら、この方法を手順として書いてみてください。
例えばf[count2%60]=GetNouCount()-t;は経過時間を測るに関わりますが、現実世界で普通の腕時計しか持っていないとして経過時間を測り続けるとしたらどうしますか?
そうですね。腕時計でレースでバイクが周回しているとしてそれぞれの周回のタイムを測るとしたらどうするでしょう?
プログラムで行き詰まっているなら、この方法を手順として書いてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
Gluek
Re: FPSについて
すみません、プログラムは組んでいる途中なんですがいくつか質問をさせてください
一つ目の質問は質問というより確認なんですけど
例えば適当な距離を3周するときに一周どれくらいのタイムで回るかをはかるときに
一回目
経過した時間
二回目
経過した時間-前回の経過時間
・
・
・
という風にすれば3周目以降も難なく計測できるわけですよね?
f[count2%60]=GetNouCount()-t; とは↑の事と同じことをしているわけですか?
二つ目はt=GetNowCount();の位置がどうしてあそこじゃなくてはいけないのかいまいち掴めないのです
経過時間を先に取得するのと後で取得するのとは何が違うんでしょうか?
教えていただけたら嬉しいです
一つ目の質問は質問というより確認なんですけど
例えば適当な距離を3周するときに一周どれくらいのタイムで回るかをはかるときに
一回目
経過した時間
二回目
経過した時間-前回の経過時間
・
・
・
という風にすれば3周目以降も難なく計測できるわけですよね?
f[count2%60]=GetNouCount()-t; とは↑の事と同じことをしているわけですか?
二つ目はt=GetNowCount();の位置がどうしてあそこじゃなくてはいけないのかいまいち掴めないのです
経過時間を先に取得するのと後で取得するのとは何が違うんでしょうか?
教えていただけたら嬉しいです
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: FPSについて
経過した時間は今の時計の指す時間と考えてもらって良いでしょう。
>経過時間を先に取得するのと後で取得するのとは何が違うんでしょうか?
時計を今見ると後で見るのとでは意味が違いますよね。それと同じです。
>経過時間を先に取得するのと後で取得するのとは何が違うんでしょうか?
時計を今見ると後で見るのとでは意味が違いますよね。それと同じです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
Gluek
Re: FPSについて
うーん・・・・
すいません、いまいちよく理解できません・・・
確かに後でみるのと今みるのとでは違うと思いますが
それがあのプログラムと何の関係があるのでしょうか?
すいません、いまいちよく理解できません・・・
確かに後でみるのと今みるのとでは違うと思いますが
それがあのプログラムと何の関係があるのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: FPSについて
分かりやすく時計の時間で説明しますが実際はミリ秒単位です。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のメモが遅れるのは良くないよって例です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
Gluek
Re: FPSについて
流れは把握できました
時間にズレが生じて正確な計算ができなくなるのであそこじゃないとだめなんですね
(多分)最後の質問になると思うんですが
ave=0が0じゃないといけない理由について・・・
aveの変数がstaticで保存されてるので一度0にしないと前回の数値がそのまま残った状態で計算されるから
と、考え付いたのですが
これで合っているのでしょうか?
時間にズレが生じて正確な計算ができなくなるのであそこじゃないとだめなんですね
(多分)最後の質問になると思うんですが
ave=0が0じゃないといけない理由について・・・
aveの変数がstaticで保存されてるので一度0にしないと前回の数値がそのまま残った状態で計算されるから
と、考え付いたのですが
これで合っているのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: FPSについて
それで合っています。
ただ、大体理解できたと思われていると思いますがサンプルを見ずに同じ物が書けないと真に理解したことにはならないのです。
なので、Dixq (管理人)さんの言われる同じ物を作ってみるは実に理にかなった勉強方法です。
今でなくても良いので、ぜひ挑戦してみてください。
ただ、大体理解できたと思われていると思いますがサンプルを見ずに同じ物が書けないと真に理解したことにはならないのです。
なので、Dixq (管理人)さんの言われる同じ物を作ってみるは実に理にかなった勉強方法です。
今でなくても良いので、ぜひ挑戦してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
Gluek
Re: FPSについて
やっと解決したんだと思います。
そのためのプログラムも頑張って今造っています。
これからもがんばります。
回答していただいた皆さん本当にありがとうございました
そのためのプログラムも頑張って今造っています。
これからもがんばります。
回答していただいた皆さん本当にありがとうございました