HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0713
イナウサFPS測定について10解決


イナウサ

リンク

2017/7/13(Thu) 21:46:23|NO.80572

お久しぶりです。皆さんに教えていただいた通りにhsphelpを使ってスクリプトを書くように
なりました。そこで質問なのですが、題でも書いたようにFPS(フレームパーセカンド)を測
定できるスクリプトを作っていたのですが、hsphelpに私の知識不足で意味が理解できない一
文がありました。「この関数を正しく動作させるためには、1 フレームごとに 1 回だけ毎回
呼び出す必要があります。」わからないままで10秒間FPSを測定して最大FPSを表示するスクリプトを
書いてみました。このスクリプトが1フレームごとに一回だけ呼び出されているのかなどのこと
で問題があれば指摘お願いします。

#include"d3m.hsp" ///////////////////////////////////////////////////////////////////////////// #module __ScriptExecutionTime__ #uselib "winmm.dll" #cfunc timer "timeGetTime" #func timeBeginPeriod "timeBeginPeriod" int #func timeEndPeriod "timeEndPeriod" int #deffunc ScriptExecutionTimeinit timeBeginPeriod 1 time_s=timer() return #defcfunc GetScriptExecutionTime timeEndPeriod 1 return (timer()-time_s) #global __ScriptExecutionTime__ //////////////////////////////////////////////////////////////////////////////// screen 0,ginfo(20),ginfo(21),,-5,0 randomize mouse 0,0 ScriptExecutionTimeinit //タイマー開始 repeat color rnd(255),rnd(255),rnd(255):boxf title ""+d3getfps()+"FPS "+maxfps+"MaxFPS" if maxfps<d3getfps():maxfps=d3getfps() if GetScriptExecutionTime()>=10000:break await 16:loop redraw 0 cls 4 color 255,255:font"",50:pos ginfo(10)/12,ginfo(11)/12 mes "最大FPS:"+maxfps+"fps"



この記事に返信する


ソラ(元スペース)

リンク

2017/7/13(Thu) 22:41:01|NO.80573

fpsとは1秒間に描画できる回数を表していますよね。
HDLに書いてるd3getfpsの説明はつまり、「1回の描画で必ず1回呼び出してね」ってことです。
このスクリプトだと、titleとifの条件と分岐後の処理で合計3回呼び出されています。
従って何度もfps値を参照する場合は適当な変数にd3getfps()の値を代入し、それを利用しましょう。

repeat fps=d3getfps() color rnd(255),rnd(255),rnd(255):boxf title ""+fps+"FPS "+maxfps+"MaxFPS" if maxfps<fps:maxfps=fps if GetScriptExecutionTime()>=10000:break await 16:loop



イナウサ

リンク

2017/7/14(Fri) 07:15:52|NO.80577

1回の描写につき1回の呼び出しと言うことなのですね。
ところで、今回はタイマーを使って一定時間10秒を測りましたがどんなに処理の遅いパソコンであれ速い
パソコンであれ、一定時間10秒は同じですよね?また、あるパソコンAでリピートをx回した場合10秒かかっ
たとするとパソコンBでは12秒などと変わったりするのでしょうか?



ソラ(元スペース)

リンク

2017/7/14(Fri) 11:33:19|NO.80579

awaitの時間が正確じゃないので、PCの性能によっては多少誤差が出ます。
timegettimeで測るのがいいでしょう。



イナウサ

リンク

2017/7/14(Fri) 12:28:25|NO.80580

よくよく考えるとこれって正しい測り方などでしょうか?他の性能の違うパソコンでやっても40FPS付近
になります。もっと高負荷をかける必要があるのでしょうか?それでしたら例えばどんなのですか?



MillkeySoftw

リンク

2017/7/14(Fri) 13:51:36|NO.80582


title ""+d3getfps()+"FPS "+maxfps+"MaxFPS"
ループ内のタイトル変更なんだけど、これ測定に影響するからね。
測定中は、外部要因をすべて排除しないと正しく測定できない。



イナウサ

リンク

2017/7/14(Fri) 14:31:00|NO.80583

もう1度アドバイスを元に書きました。

#include"d3m.hsp" ///////////////////////////////////////////////////////////////////////////// #module __ScriptExecutionTime__ #uselib "winmm.dll" #cfunc timer "timeGetTime" #func timeBeginPeriod "timeBeginPeriod" int #func timeEndPeriod "timeEndPeriod" int #deffunc ScriptExecutionTimeinit timeBeginPeriod 1 time_s=timer() return #defcfunc GetScriptExecutionTime timeEndPeriod 1 return (timer()-time_s) #global __ScriptExecutionTime__ //////////////////////////////////////////////////////////////////////////////// screen 0,ginfo(20),ginfo(21),,-5,0 randomize mouse 0,0 ScriptExecutionTimeinit //タイマー開始 repeat fps=d3getfps color rnd(256),rnd(256),rnd(256):boxf if maxfps<fps:maxfps=fps if GetScriptExecutionTime()>=10000:break await 16:loop redraw 0 cls 4 color 255,255:font"",50:pos ginfo(10)/12,ginfo(11)/12 mes "最大FPS:"+maxfps+"fps"



MillkeySoftw

リンク

2017/7/14(Fri) 15:08:59|NO.80584

>>もう一度アドバイスを元に書きました。
スクリプト自体は問題ないと思われます。

-- 結果 --
Windows 10 Pro Insider Preview[64Bit](1703 16237.1001)
Intel G530 2.4Ghz : 50 FPS



イナウサ

リンク

2017/7/14(Fri) 15:26:55|NO.80585

millkysoftwさん実証テストありがとうございます。
ちなみにですが

color rnd(256),rnd(256),rnd(256):boxf
は必要ですよね?



MillkeySoftw

リンク

2017/7/14(Fri) 15:32:13|NO.80586

color rnd(256),rnd(256),rnd(256):boxf
を消す場合、純粋にタイマー関数と await 16 のみのFPS テストになります。

なにも描画処理をしないので、ここでのFPS が純粋のフレームレートです。
この状態で 60FPS または 59.? FPS になっていない場合、それが設計上の最大フレームとなります。



イナウサ

リンク

2017/7/15(Sat) 10:49:39|NO.80596

ありがとうございました。解決です。



ONION software Copyright 1997-2023(c) All rights reserved.