Nanashi-softプログラマ専用Javaアプリケーション


◇Javaアプリケーション-60fpsを作る-

◎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);
    }
  }
}



TOPプログラマ専用Javaアプリケーション