1

非常に奇妙な (最終的にはゲームがクラッシュする) ことに気付きましたがThread.sleep()、何が問題なのかわかりません。次のメソッドを 2 時間連続で実行しましたが、出力は常に 100+-5 です。

public void gameLoop() {
    t0 = time();
    while (GameState.getInstance().getState() == GameCondition.RUNNING) {

        engine.update();
        sfx.play();

        t1 = time();
        delta = t1 - t0;

        gfx.render((int) delta);
        t0 = time();
        System.out.println(delta);
        sleep(100);
    }
}

まったく同じ方法を実行すると、定数 100 の間スリープする代わりに、delta

public void gameLoop() {
    t0 = time();
    while (GameState.getInstance().getState() == GameCondition.RUNNING) {

        engine.update();
        sfx.play();

        t1 = time();
        delta = t1 - t0;

        gfx.render((int) delta);
        t0 = time();
        System.out.println(delta);
        sleep(delta);
    }
}

そして今、出力は次のようになります。

0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

2

....
 After a minute
 571

疲れすぎて明らかな間違いを犯したのか、それとも非常に奇妙なことが起こっているのかわかりません。これが睡眠です。

private void sleep(long milliSeconds) {
    System.out.println();
    try {
        Thread.sleep(milliSeconds);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

編集:問題?sleep(100)内部メソッド (スリープ前) は実質的に時間を使用しないため (テストで証明されているように)、デルタは「漏れています」。

4

1 に答える 1

6

ループでは、デルタ計算には以前にスリープした時間が含まれており、この新しいデルタ時間のためにスリープします。スリープ (またはコード) がこれまでにない場合 (たとえば、1 ミリ秒発生する可能性があります)、次回はデルタが 1 ミリ秒長くなるため、2 ミリ秒スリープします。

前回は 2 ミリ秒スリープしていたので、次の反復は少なくとも 2 ミリ秒になります。スリープまたはコードが再び遅い場合 (これは発生します)、次回は 3 ミリ秒スリープします。以前のスリープ時間とそのエラーを含むデルタが原因で発生する可能性のあるすべての速度低下を蓄積しています。

于 2013-04-11T23:48:21.397 に答える