19

私はゲーム ループを書いています。以下の例のコードを見つけました。この記事など、ゲームループを実行する他の方法も調べました。しかし、それらのどれも機能させることができませんでした。そのため、最初のリンクのものをそのまま使用しました。

私が知りたいこと:

  • 私がゲームループを書いた方法はこれを行うのに良い方法ですか?
    • 助言がありますか?
  • Thread.sleep();ゲームループで使用する必要がありますか?

これが私の現在のコードです:

public void run(){
    long lastLoopTime = System.nanoTime();
    final int TARGET_FPS = 60;
    final long OPTIMAL_TIME = 1000000000 / TARGET_FPS;
    long lastFpsTime = 0;
    while(true){
        long now = System.nanoTime();
        long updateLength = now - lastLoopTime;
        lastLoopTime = now;
        double delta = updateLength / ((double)OPTIMAL_TIME);

        lastFpsTime += updateLength;
        if(lastFpsTime >= 1000000000){
            lastFpsTime = 0;
        }

        this.updateGame(delta);

        this.repaint();

        try{
            Room.gameTime = (lastLoopTime - System.nanoTime() + OPTIMAL_TIME) / 1000000;
            System.out.println(Room.gameTime);
            Thread.sleep(Room.gameTime);
        }catch(Exception e){
        }
    }
4

3 に答える 3

7

全体として、これは良いループですが、私が経験上最高のループであると判断したものには、いくつか欠けている側面があります。

最終的にはLWJGLやその他の Java ゲーム APIに移行したくなるでしょうが、今のところは、ゲーム ループがどのように機能するかの基本と、ニーズに最も適したものを学んでください。

  • まず、あなたのポイントの1つに答えて、いいえ。近づかないほうがいい

    Thread.sleep()

    これは、スリープに設定した実際の時間からずれることがあります。
    たとえば、10 ミリ秒スリープするように設定すると、プログラムが 5 ~ 20 ミリ秒スリープする可能性があります。

  • すぐにわかる 2 つ目の問題は、カスタム stop() メソッドのゲームループを停止する方法がないことです。試す

    ブール実行 = true;
    while (running) {
    // コードをここに //
    }

  • 第三に、デルタ変数の使用方法を変更することを検討してください。以下のコードの方法は、あなたにとってより良い使い方と構造かもしれません。

    これは、プログラムで使用するゲーム ループの例です。

    @Override
    public void run() {
    
    long initialTime = System.nanoTime();
    final double timeU = 1000000000 / UPS;
    final double timeF = 1000000000 / FPS;
    double deltaU = 0, deltaF = 0;
    int frames = 0, ticks = 0;
    long timer = System.currentTimeMillis();
    
        while (running) {
    
            long currentTime = System.nanoTime();
            deltaU += (currentTime - initialTime) / timeU;
            deltaF += (currentTime - initialTime) / timeF;
            initialTime = currentTime;
    
            if (deltaU >= 1) {
                getInput();
                update();
                ticks++;
                deltaU--;
            }
    
            if (deltaF >= 1) {
                render();
                frames++;
                deltaF--;
            }
    
            if (System.currentTimeMillis() - timer > 1000) {
                if (RENDER_TIME) {
                    System.out.println(String.format("UPS: %s, FPS: %s", ticks, frames));
                }
                frames = 0;
                ticks = 0;
                timer += 1000;
            }
        }
    }
    
于 2014-05-17T00:07:27.427 に答える