SDKに付属するstopwatch.ujmlについて解説する。
stopwatch.ujmlはその名のとおりストップウォッチである。一秒毎に画面上に秒数が表示されていく。今回解説するのはこのサンプルにおける<delay>要素の使い方。まずは、ソースコード(抜粋)を参照。
<delay>に指定するミリ秒数について:
<delay>要素で指定したミリ秒後に<script>要素内が実行されるはずだが、実行キューに他の処理がたまっていると指定した時間に処理が始まらない可能性がある。それをできるだけ避ける方法がstopwatch.ujmlに含まれている。
これまで紹介したサンプルにも同じようなタイマーを実現したものがあるが、<delay>要素に1,000ミリ秒を指定していた。実は1,000ミリ秒を指定するよりもstopwatch.ujmlのように100ミリ秒を指定した方がより正確に画面上に秒数を描画できる。もちろん、100ミリ秒を指定した場合には太字のソースコード部分のように、都度実際の経過時間を測定し、必要があれば描画するという方法にしなければならない。
<state var="sTimer">
<transition value="true">
<delay>&DELAY_MSEC;</delay>
<script>
// Check and see if a second has passed since the
// last check.
mMSecElapsed = _msec();
if ((mMSecElapsed - mMSecStart) &_GTE; 1000)
{
// Update the seconds display.
mLastSec = (mMSecElapsed - mMSecStart) / 1000;
_clear_state(sSeconds);
sSeconds = sSeconds;
}
// Update the timer.
_clear_state(sTimer);
sTimer = sTimer;
</script>
</transition>
</state>
※stopwatch.ujmlにはよろしくない部分もあるので念のためメモ
・ステート変数sSecondsの<state>要素内で<label>が何故か重複している。ヴィジュアル要素の子要素にヴィジュアル要素を指定しても問題無いのでコンパイルは通るが、これは意味が無い。
・sSecondsの値trueに対応する<transition>要素内にファンクションキーの描画(<fn>)があるが、毎秒再描画されることになり無駄な気がする。ファンクションキーの描画を管理するステート変数を別に用意した方が良いのでは?と思うが、その場合コンパイル時のファイルサイズが大きくなってしまう(20Byteぐらい)。どうしたものか。