クライアントスペックによる処理速度の差を軽減するために,作成した.

定速化ウエイトルーチン

 /**
  * $Id: C4EAC2AEB2BDA5A6A5A8A5A4A5C8A5EBA1BCA5C1A5F3.txt,v 1.1.1.1 2009/06/01 12:21:04 kamoi Exp $
  * Copyright 2005 kamoland.com All rights reserved.
  */
 package com.kamoland.rensacommon;
 
 /**
  * 時間を定速に保つためのウエイト処理
  * 
  * @author kamoland.com
  * @version
  * <pre>
  * 2005.04.24 新規作成
  * </pre>
  */
 public class TimeKeeper {
 
 	private long tm;
 	
 	/**
 	 * デフォルトコンストラクタ 
 	 */
 	public TimeKeeper() {
 	}
 
 	/**
 	 * 時間を保ちたい処理の開始を設定する
 	 *
 	 */
 	public void startSection() {
 		tm = System.currentTimeMillis();
 	}
 	
 	/**
 	 * 時間を保ちたい処理の終了を設定する.
 	 * 開始設定時点からの経過時間に応じて,ウエイトを入れる
 	 * 
 	 * @param keepMsec 保つべき時間(msec)
 	 * @return 待ちを実施した時間(msec)
 	 */
 	public long closeSection(long keepMsec) {
 		tm += keepMsec;
 
 		// 保つべき時間と経過時間を用いて,待ち時間を動的に決定する
 		long diffMsec = Math.max(0, tm - System.currentTimeMillis());
 		
 		// 待ちを入れる
 		Util.sleep(diffMsec);
 		
 		return diffMsec;		
 	}
 }

なお,Util.sleep()は,内部ではThread.Sleep()を呼び出している. 単にExceptionをcatchする手間を省くための,ラッパーメソッド.

呼び出し例

 		TimeKeeper tk = new TimeKeeper();
 		
 		for (int p = startPoint; p > endPoint; p -= step) {
 			tk.startSection();
 			if (enableAnime) {
 				drawJamapuyoBombNotify(new JamaBall(p));
 			}
 			tk.closeSection(80);
 		}
 		drawJamapuyoBombNotify(newJamapuyo);

TimeKeeperクラスのインスタンスを作り(tk), 定速で実行したい処理をtk.startSection()とtk.closeSection()で挟む.

closeSection()の引数には,想定する実行時間を渡す.この例では,80msecで実行させている.

速いマシンで処理が速く終わった場合は,closeSection()内でウエイトが入ってstartSection()時から80msec経つまで待って時間調整することになる.

制約として,遅すぎるマシンで処理に80msec以上かかってしまった場合は,ウエイトは0になるが,既に80msec以上経ってしまっているわけで,もはや定速とは言えない.

速いマシンを抑えるという効果があるが,遅いマシンはどうしようもないというわけである.


参考資料

Animation in Java applets (JavaWorld)
均一なfpsで描画しようという話.
http://www.javaworld.com/javaworld/jw-03-1996/jw-03-animation.html


© 2024 KMIソフトウェア