Nanashi-soft○プログラマ専用○Javaアプリケーション○
◎60fpsを作る
普通にミリ秒を取ってループすればいいだけ
ループの前に現在の時間を取って,ループの最後にウェイトを行う
//60fps制御用変数初期化 long t1 = System.currentTimeMillis(); //無限ループ while (true){ //〜ここで色々処理〜 //画面再描画 cvs.repaint(); //60fpsになるようにウェイトを入れる while (System.currentTimeMillis() < t1 + 1000/60){ } //次のフレーム用の時間に進める t1 += 1000/60; }
厳密に言えば 1000/60=16.66666...で割り切れないのでずれていきます
もっと言えば,実際に表示時にタイミングを取っているわけでは無いので,毎フレームに揺らぎがあります
これはそこまで要求されない,単純な例です
◎サンプルソース
import java.awt.*; import java.awt.event.*; public class fst extends Frame{ //裏画面用変数 static Image ura; static Graphics ug; //描画中フラグ static Boolean pflg=false; public static final void main(final String[] args){ //ウィンドウ生成 Frame app=new Frame(); //タイトル設定 app.setTitle("Title"); //ウィンドウサイズ設定(タイトルや枠も含んだサイズ) app.setSize(240, 240); //キャンバスを配置 fstCanvas cvs=new fstCanvas(); app.add(cvs); //ウィンドウ表示 app.setVisible(true); //裏画面生成 ura = cvs.createImage(240, 240); ug = ura.getGraphics(); //60fps制御用変数初期化 long t1 = System.currentTimeMillis(); //無限ループ while (true){ //描画チェックフラグが立っていなければ描画する if (pflg == false){ //座標用変数 int x, y; //カラー用変数 int red, green, blue; //ランダムに座標を生成 x = (int)(Math.random() * 240); y = (int)(Math.random() * 240); //ランダムにカラーを生成 red = (int)(Math.random() * 256); green = (int)(Math.random() * 256); blue = (int)(Math.random() * 256); //ペンの色を変える ug.setColor(new Color(red, green, blue)); //点を描画する ug.drawLine(x, y, x, y); //描画中フラグを立てる pflg = true; //画面再描画 cvs.repaint(); //60fpsになるようにウェイトを入れる while (System.currentTimeMillis() < t1 + 1000/60){ } //次のフレーム用の時間に進める t1 += 1000/60; } } } static class fstCanvas extends Canvas{ public void paint(Graphics g){ //描画中フラグが立っていたら処理する if (pflg == true){ //裏画面を実画面にコピー g.drawImage(ura, 0, 0, null); //描画中フラグをクリア pflg = false; } } //updateメソッドを乗っ取って,画面クリアを防ぐ public void update(Graphics g){ paint(g); } } }