2014年6月13日金曜日

Processingの起動時間

millis()という関数でint型の起動時間がミリ秒で帰るようです
これを使えば起動時間を最大20日程度まで計測できます

似た関数に second() minute() hour() day() month() year() がありますが、これはシステム時間を返す関数なので注意してください


ProcessingではframeCountという変数があり、これは1フレーム毎にインクリメントされていきます
またframeRateという変数もあり、起動時間 = frameCount / frameRateと計算できるのでは? と思うのですが そう簡単なものでもありません

というのは、frameRateを表示してみればわかると思いますが、このframeRate変数は定数ではありません

frameRate()関数で設定できるのはあくまで目標値であり、実際のフレームレートはPCの処理速度や負荷に応じて変動しています
frameRate変数で獲得できるフレームレートは実際に計測したフレームレートなので、frameCount / frameRateの計算をすると 負荷が大きい時には実際よりも長く起動していると計算されてしまいます


そこで、起動時間を計算する方法ですが
まず前提として「1.0 / frameRate = 前フレームから経過時間」という条件を作ります
実際のframeRateの計算方法を知らないのでこの条件が当てはまるかはわかりません

しかし、こうすることで非常に簡単に計算できるようになります
前フレームからの経過時間が分かれば、フレームごとに時間を積算すればいいだけです
ということで
float time = 0;
void draw() {
    time += 1.0 / frameRate;
}
とすれば稼働時間がわかります

浮動小数点演算の精度がきになる場合は
int second = 0; float millisecond = 0;
void draw() {
    if ((millisecond += 1.0 / frameRate) >= 1.0) { millisecond -= 1.0; second++; }
}
とでもしておけばmillisecondの最大値はせいぜい1.1以下におさまるはずなので、演算時の切り捨ては無視できると思います
(小数点以下の演算誤差は相変わらず存在します)


とりあえずこれで時間が扱えるようになりました
なんかの処理に使えるかも

言い訳をすると、day hour millis minute month second yearと並んでいるので、millisはシステム時間のミリ秒を返す関数かと思っていました
システム時間のミリ秒が欲しい場合はどうすればいいんだろう?

0 件のコメント:

コメントを投稿