3

私はゲームを開発していて、別のコンピューターでテストして、解像度が問題ないかどうかを確認したかっただけですが、1つの大きな問題に気付きました。ゲームは何らかの理由でスローモーションで実行されます...ラグはありませんが、遅いモーション..私のゲームループは一時的です:

while(gameisRunnin){
     doStuff();
     Thread.sleep(1000/60);

doStuff();しかし、テストの後、コードを実行するのにどれくらいの時間がかかるかを確認しようとしましたが、次のようにテストしました:

while(gameisRunnin){
     long startT = System.currentTimeMillis();
     doStuff();
     long stopT = System.currentTimeMillis();
     System.out.println(stopT-startT);
     Thread.sleep(1000/60);

それが私に与える結果は、両方のコンピューターで0です(完全な速度で実行されるゲームを開発しているコンピューターと、スローモーションで実行されるPCで..また、ナノタイムでテストしました。私も両方の計算で50000-80000が好きです(ほとんど同じ結果です。真剣にどうしたのですか?スーパーマンは私を救うことができますか?

更新: わかりましたので、全画面表示ではなく他のコンピューターでゲームを実行すると正常に動作しますが、全画面表示の場合はスローモーションです更新: 私はここでスーパーヒーローのようです。表示モードをリフレッシュに設定しました未知への率、私はそれが全体の問題だったと思います...

4

3 に答える 3

2

通常「デルタ時間」と呼ばれるものを使用する必要があります。基本的には、ゲーム ループの 1 回の繰り返しにかかる時間を測定し、この数値をすべての動きに使用することを意味します。

これは、コンピューターによって FPS のカウントが異なるためです。オブジェクトを一定量のピクセルだけ移動する代わりに、速度を定義し、実際の動きのサイズを動的に計算します。

短い例:

public void gameLoop() {
    long initialTime = System.nanoTime();

    game.redraw();
    game.update(System.nanoTime() - initialTime);
}

// inside the class Game
public void update(long deltaTime) {
    someObject.moveToRight(deltaTime * speed);
}
于 2013-10-06T18:57:47.740 に答える
1

答えは、ゲームのリフレッシュ レートがモニターでサポートされていなかったことです。リフレッシュ レートを 60 から変更DisplayMode.REFRESH_RATE_UNKNOWNすると、スローモーションの問題が修正されます。

于 2013-10-06T19:47:00.970 に答える
0

この記事を読む:ここをクリック

また、System.getTimeMillis() は正確ではないため、 System.nanoTime()を使用してください。

于 2013-10-06T18:48:23.130 に答える