投稿
おちゃめ ochame_nako
動作中のプログラムのfps(実行速度)を取得可能なFPS関数と1/1000秒タイマーを使って0.1fps単位の正確なfpsを取得可能なFPSM関数を作りました。詳細はコメントにて。
9そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
引数を指定することで何秒ごとに値を更新するかを選べます。FPS(1)とすれば1秒単位でfpsの取得が可能でFPS(0.5)とすれば0.5秒単位でfpsが取得可能です。1秒未満の短い時間でもfps取得が可能ですが、更新間隔が長い方がより正確なfpsを取得可能です。 最初に取得した値は正しくないため2度目(更新間隔が1秒の場合は1秒後)以降のものを参考にしてください。 FPS関数の方はグローバル変数_FPS0、_FPS1、_FPS2を使用しているのでプログラムの最初でVARを使って定義しておいてください。
0そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
FPSM関数の方は私が作った1/1000秒(1ミリ秒)単位で取得できるTIMER関数を使いより正確なfpsを短時間で取得可能です。 0.1~0.2秒程度の更新間隔でも誤差1%以下の正確なfpsを取得できます。 FPSM関数の方はグローバル変数_FPSM0、_FPSM1、_FPSM2、_FPSM3、_FPSM4を使用しているのでプログラムの最初でVARを使って定義しておいてください。
0そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
なお、FPSMの方はTIMER関数が必要であるため表記のリストではコメントアウトしています。 TIMER関数については私の活動を参照してください。 FPS、FPSMともに1/更新間隔fpsより遅い場合はfpsを取得できません。 つまり、FPS(0.5)の場合は取得できる最小が1/0.5=2fpsということです。 FPS(5)の場合は1/5fpsが最小になりますが、1fps単位の表示になるためあまり意味はないです。
0そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
ちなみにこのサンプルプログラムを実行するとFPS(1)は7fpsを取得しているのが分かります。VSYNC 9は約6.66fpsなのでほぼ想定通りの値です。 ところが、素早く取得するためFPS(0.5)とすると8fps、FPS(0.2)では10fpsになっていまいます。 しかし、FPSM(0.2)は即座に6.6fpsという正確な値を返します。1/1000秒タイマーの本領発揮ですが、やはり、こういう機会でもないと発揮する場面がないかもしれません。
0そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
1/1000秒単位で計測可能なTIMER関数は数秒単位の比較的長い時間を計測する場合にはMAINCNTよりも少ない誤差で計測が可能なのですが、1フレーム未満の短い時間だと私の計測の結果最大で10%くらいの誤差があります。 つまり、1回につき何ミリ秒かかるかを計測してfpsを求めると非常に大きな誤差が出るため使い物になりません。 したがって、FPSM(1)ならば1秒間に○回と×ミリ秒という形で計測しています。 これならば○回から1回あたりの時間はかなり正確に求まるためそれを元に小数部分は別途計算しているわけです。 だから、0.1fps単位で(ほぼ)正確な値が取得できています。(理論上は500fpsを越えると0.1fps単位では取得できなくなるけど)
0そうだね
プレイ済み
返信[6]
親投稿
おちゃめ ochame_nako
MAINCNTでも5秒くらいの時間を掛ければ上記の方法で(30fps以下のプログラムならば)0.1fps単位で取得が可能になります。(ただし、表示は1fps単位で丸めているためFLOORのカッコ内の処理を10倍して後から10で割るということが必要になる) ちなみにFPSM関数内で10.03を掛けて10で割っているのにはちゃんと意味があり、プチコン3号では1フレームが正確に1/60秒ではなく約1/59.835秒なのでその誤差を補正するためです。 端的に言えばVSYNC 1で処理落ちせず動作しているプログラムを「60fps」と表示するための補正です。
0そうだね
プレイ済み
返信[7]
親投稿
おちゃめ ochame_nako
上記方法によってMAINCNTを使ったFPS関数でも0.1fps単位で取得できるようにしてみました。 TIMER関数を使ったFPSMより若干精度は落ちますがそれでも更新間隔1秒のときで誤差は1%未満です。0.2秒でもそれなりの精度で取得可能です。
0そうだね
プレイ済み
返信[8]
親投稿
打ち込んで見ました。 あ、FPSMを使うには、 TIMERが要るんですね。 三( ^^)そっちも打ち込みにいきます!
0そうだね
プレイ済み
返信[9]
親投稿
出来ました! おお、これは、 プチコンOSの実行速度表示にぴったり♪ 借りまーす!
0そうだね
プレイ済み
返信[10]
親投稿
実装かんりょー♪ ありがとうございます! スタッフロールにのせときますね。
0そうだね
プレイ済み
返信[11]
親投稿
おちゃめ ochame_nako
使用して頂きこちらこそありがとうございます。 FPS関数もFPSM関数も単純に実行回数などをカウントしているだけの単純なアルゴリズムであるため(計測開始時を除き)想定外の大きな誤差が出るという心配はありません。 FPSM関数ならば更新間隔0.2秒でもほぼ±1%以内に誤差は収まりますが、更新間隔が1秒ならばさらに誤差が減らせます。 なおこのFPSM関数では結果を返す時にFLOORで丸めていますが、59.9fpsと60fpsが交互に表示されて困るという場合にはROUNDで丸め処理を行えば表示が安定しやすくなります。
0そうだね
プレイ済み
返信[12]
親投稿
おちゃめ ochame_nako
うえこうさんへ 使って頂けるだけで十分なのでそれ以上は望みません。 とはいえスペシャルサンクスへの掲載は大歓迎です。 あと改変等も自由に行って問題ありません。
0そうだね
プレイ済み