処理メーター表示したり

 ファミコンくらいの頃から、ゲームの処理がどれくらいかかっているかを画面に表示する、
「処理メーター」を良く目にしました。
 画面の端に、メーターが表示され、そのメーターが振り切れると、処理オーバー、という事が判る仕組みです。
 そうですね、CPUメーターみたいなものです。


 作っているゲームのCPUパワーがどれくらい残っているか、足りないかの目安ですね。
 足りないと、処理落ちして、動きがガクガクしますから、ゲームでは重要です。


 この処理メーター、ずっと作ってみたくて、この間作ってみました。


 まず、使っているフレームレートの処理時間を割り出します。
 処理落ちは別とすれば、フレームレートはたいていゲーム中変えませんから、
これはゲーム開始時に一度求めれば良いですね。
 NSTimeInterval の変数に秒単位(小数点ありです)の時刻が入ります。

	NSTimeInterval lengthOfframeTime = 1.0f/(60.0f*animationFrameInterval);

 animationFrameInterval は、1/60なら1。1/30なら2が入ります。n/60という意味です。
 次は、処理開始時の時刻の取得。

	NSTimeInterval startTime = [NSDate timeIntervalSinceReferenceDate];

 最後に、処理の最後の時刻の取得と、処理時間を100%としての処理の割合の算出。

	NSTimeInterval timeNow =[NSDate timeIntervalSinceReferenceDate];

	NSTimeInterval tempTime = (timeNow-startTime)/lengthOfframeTime;


 後はこれをメーターに表示するだけです。
 描画の方は、OpenGLなら、テクスチャ無しで矩形表示が良いでしょう。
 処理メーターで処理負荷増やしたくないですからね。


 正確な処理メーターにするには、前のフレームでの処理終了(つまり描画終了)で、
timeNow を取得して、次のフレームでそれを描画すると良いのですが、
前のフレームの値を保存する事と、前のフレームの情報になるなぁ、という気分から
少々正確さには欠けますが、描画の最後の段階で、timeNowを取得してそのフレームに描画、
という実装にしました。


 さて、実際の処理メーターですが、内部処理までのものと全体の二つを用意したのですが、
シミュレータでは、内部処理がほとんど表示されませんでした。
 初めはバグか?と思ったのですが、macの処理速度が速すぎてほぼ0だったのですね。
 実機ではそれなりの割合でした。
 こういうところで、シミュレータと実機の違いが出てきます。