見出し画像

Processing 3.0で実測フレームレートを表示する

はじめまして。タイトルの通りprocessingでフレームレートと1フレームあたりの実行時間を表示するコードを自分用に書いたので公開します。
※processing 3.0で動作します。

processingはframeRate()を用いることでフレームレートを変更することが出来ますが、PCの処理能力の問題で明らかに設定したフレームレートで実行してくれないことがあります。そんなときにこのコードを用いれば実際のところどれくらいの時間で実行しているのか?を知らせてくれます。

初心者が作成したのものなので至らない箇所があるかと思いますが。。サンプルコードは以下です。




Survey survey = new Survey();

void setup() {
size(1000, 1000);
frameRate(60);
survey = new Survey();
}

void draw() {

survey.print_();
}

class Survey {
int fpsf;
long nowTime;
long frameTime;
double f;
float fps;
int frame_survey;
long startTime = System.currentTimeMillis();

void print_() {
  frame_survey++;
  if (frame_survey == 1)frameTime = System.currentTimeMillis();
  fpsf++;
  nowTime= System.currentTimeMillis();
  double time=Math.floor((nowTime-startTime)/1000);
  if ( time - f >= 1)
  {
    println(fpsf +" fps / "+((nowTime-frameTime)/fpsf)+" ms ");
    fpsf=0;
    f=time;
    frameTime = System.currentTimeMillis();
  }
}
}

実行すると以下のように出力します。毎秒ごとのフレームレートは整数で扱っているため少数以下は切り捨て表示されます。1フレームの実行時間は単純に次のフレームまでの時間を毎秒ごとのフレーム数で割り算しているために毎秒ごとの平均になります。(ただし実行に一秒以上かかる場合も1 fpsと表示されます。その場合右の実行時間が目安になります。)

画像1

導入方法

すでに書いたコードにも簡単に追加できます。(activeモードの場合)
サンプルコードを見ればおわかり頂けると思います。一応解説しますと、まずは以下のコードを冒頭に追加します。

Survey survey = new Survey();


次にsetup関数内にこのように追加します。

void setup() {
size(1000, 1000);
frameRate(60);
survey = new Survey();
}

次ににdraw関数内に

void draw() {
survey.print_();
}

と記述します。
あとはサンプルコードのclass Surveyの中身をまるごと適当な場所にコピペします。
以上です。

仕組みの解説

startTimeで開始時のミリ秒を取得
nowTimeで現在のミリ秒を取得
frameは開始してからの総フレーム数
fpsfは一秒間にカウントアップするフレーム

double time=Math.floor((nowTime-startTime)/1000);
で、現在の時刻から開始時の時間の差を1000で割り、小数点以下をfloorで切り捨てることで一秒の部分のみを抽出しています。
fには前回更新したtimeの値が入っています。
if( time - f >= 1)で、前回のfの値よりtimeが1以上大きくなれば
fpsfなどを出力します。
出力したらfpsfを0にリセットし、fにtimeの値を入れます。

流れとしては
最初のミリ秒→0
現在のミリ秒→1001になると
timeが1になる。
最初はfの値が0なので
if( time - f >= 1)の中身が実行され、fpsfが出力される。
その後fpsf=0、f=1(timeの中身)が入る。
次回のミリ秒が2001になった場合
time=2になり、if( time - f >= 1)が満たされ以下ループ

といった感じです。

感想

もっとコードをコンパクトに、少数以下までフレームレートが出せたらいいなあという気持ちですが、実験したところ私の環境では500fpsまで上げても問題なく計測出来たので負荷はあまり無いようですし特に問題なく動いているのでまあいいかなと。


この記事が気に入ったらサポートをしてみませんか?