1. ホーム
  2. java

[解決済み] Javaメインゲームループ

2022-02-20 03:04:27

質問内容

私はゲームのループを書いています。 こちら . 私はまた、ゲームループを行う他の方法、例えば、から見てきました。 この記事 . でも、どれもうまくいかなかったんだ。だから、最初のリンクのものを使い続けました。

知りたいこと

  • ゲームループの書き方はこれで良いのでしょうか?
    • 何か提案はありますか?
  • を使用する必要があります。 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){
        }
    }

解決方法は?

最終的には、次のようなものに移行したいと思うでしょう。 LWJGL でも、今は今やっていることを続けてください。基礎的なことを学ぶことができます。

ループの作成、お疲れ様でした。いい感じですね!少しアドバイスをさせてください。

  • リペイントはすぐに画面をレンダリングするわけではありません。それは リペイントマネージャ が準備でき次第、レンダリングする。使用方法 <ストライク 無効化 paintImmediately の代わりに paintImmediately はコンポーネントが再描画されるまで実行をブロックするので、レンダリング時間を測定することができます。

  • Thread.sleep 通常、数ミリ秒のドリフトがあります。ループがCPUを使いすぎないようにするために使うべきですが、10ミリ秒スリープしたら5ミリ秒スリープするかもしれないし、20ミリ秒スリープするかもしれないことを理解しておいてください。

  • 最後に

    double delta = updateLength / ((double)OPTIMAL_TIME);
    
    

    もし updateLength が OPTIMAL_TIME よりも小さい場合、update を呼び出さない。言い換えれば、デルタが1より小さい場合、アップデートを行わない。 このチュートリアル は、その理由を私よりもうまく説明してくれています。