クライアントスペックによる処理速度の差を軽減するために,作成した.
定速化ウエイトルーチン
/** * $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以上経ってしまっているわけで,もはや定速とは言えない. 速いマシンを抑えるという効果があるが,遅いマシンはどうしようもないというわけである.
参考資料
|