Runnable で FPS を制御

Runnable で FPS(frames per second) を制御します。

前田稔の超初心者のプログラム入門

プログラムの作成

  1. メモ帳などでタイプして FpsRunnable.java の名前で保存して下さい。
    //★ Runnable で FPS を制御    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import java.util.Date;
    
    class FpsRunnable extends JFrame
    {   Dimension   size;
    
        // Main
        public static void main(String args[])
        {   new FpsRunnable();
        }
    
        // Constructor
        public FpsRunnable()
        {   super("Thread Time");
            ThreadClass threadcls = new ThreadClass();
            Thread thread = new Thread(threadcls);
            thread.start();
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(300, 200);
            setVisible(true);
            size = getSize();
        }
    
        // Paint Method
        public void paint(Graphics g)
        {
            g.setColor(getBackground());
            g.fillRect(0,0,size.width,size.height);
            g.setColor(Color.black);
            Date now = new Date();
            g.drawString(now.toString(),50,100);
            System.out.println(now);
        }
    
        //  Runnable Class
        class ThreadClass implements Runnable
        {
            public void run()
            {   long    nowTime,stopTime,drawTime;
    
                System.out.println("Thread Start");
                nowTime= System.currentTimeMillis();
                stopTime= nowTime+5000;
                drawTime= nowTime+500;
                while(nowTime<stopTime)
                {   nowTime= System.currentTimeMillis();
                    if (drawTime<nowTime)
                    {   drawTime= nowTime+500;
                        repaint();
                    }
                }
                System.out.println("Thread Stop");
            }
        }
    }
    
  2. java のソースファイルをコンパイルして class オブジェクトを実行して下さい。
    スレッドからの指示で、ウインドウに現在時刻が表示されます。

プログラムの説明

  1. ネットで検索すると Thread のプログラムが沢山ヒットします。
    Java を使うと簡単にプログラミング出来るのと、皆様方の関心が高いせいでしょうか。 (^_^;)
    1秒間に描画するフレーム数を FPS(frames per second)と言います。
    コンシューマゲームでは、垂直同期信号に合わせてフレームを描画する方法などが用いられますが、 Windows(DirectX) の環境ではマシンの性能や設定により同期信号の周波数が異なります。
    そこで、タイマー割り込みや高精度タイマーを使って FPS を一定に揃えます。
    今回は Runnable で Thread を起動して FPS を制御する方法を説明します。
    Thread で FPS を制御する方法は Thread で FPS を制御 を参照して下さい。
  2. スレッドのプログラムは Thread を継承する方法と、Runnable を実装する方法があります。
    Java では継承出来る Object は一個だけなので、継承が使えないときは implements(実装)を使います。
    threadcls = new ThreadClass() で Thread を実装した Class をインスタンス化します。
    Thread(threadcls) で Thread をインスタンス化します。
    thread.start() で Thread を起動します。
        // Constructor
        public FpsRunnable()
        {   super("Thread Time");
            ThreadClass threadcls = new ThreadClass();
            Thread thread = new Thread(threadcls);
            thread.start();
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(300, 200);
            setVisible(true);
            size = getSize();
        }
        
  3. Thread を実装した ThreadClass です。
    thread.start() で起動すると ThreadClass の run() メソッドが実行されます。
    System.currentTimeMillis() で高精度タイマーでミリ秒単位の時刻を取得します。
    nowTime が現在時刻、stopTime が終了時刻、drawTime が描画する時刻です。
    while(nowTime<stopTime) でメッセージループもどきに入ります。
    このループは stopTime になるか、プログラムが終了するまで、メインと独立して回り続けます。
    drawTime になると repaint() でウインドウを描画します。
    drawTime= nowTime+500 の 500 が描画サイクルです。
    コンシューマゲームでは、1秒間に60(30)フレーム描画されるのですが、さすがに Java ではしんどいかも知れません。 (^_^;)
        //  Runnable Class
        class ThreadClass implements Runnable
        {
            public void run()
            {   long    nowTime,stopTime,drawTime;
    
                System.out.println("Thread Start");
                nowTime= System.currentTimeMillis();
                stopTime= nowTime+5000;
                drawTime= nowTime+500;
                while(nowTime<stopTime)
                {   nowTime= System.currentTimeMillis();
                    if (drawTime<nowTime)
                    {   drawTime= nowTime+500;
                        repaint();
                    }
                }
                System.out.println("Thread Stop");
            }
        }
        
  4. ネットで見つけた Thread Program のページです。
    Thread のページ1
    Thread のページ2
    Thread のページ3

超初心者のプログラム入門(Java2)