1

J2MEゲームの開発について一連の質問をしましたが、最近の質問では、NeilCoffeyがコメントしました。

副次的な問題として、J2MEゲームで本当に100ティック/秒を実行したいですか?sbが述べたように、毎回一定の時間ではなく、次に希望するウェイクアップポイントまで実際にスリープする必要があります。

どういうわけか、そのことが頭に浮かび、答えが欲しいのですが、ゲームループを目的のウェイクアップポイントまでスリープさせるには何が必要ですか。そのポイントxDがどこにあるのか(理論的には)わかりません。

フィードバックのために、これは私のゲームループの簡略版です。

public void run() {
    Graphics g = this.getGraphics();
    while (running) {
        long diff = System.currentTimeMillis() - lastLoop;
        lastLoop = System.currentTimeMillis();
        input();
        this.level.doLogic();
        render(g, diff);
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            stop(e);
        }
    }
}

ご協力いただきありがとうございます!!

4

2 に答える 2

3

まだ読んでいない場合は、ここにゲームループに関する優れた記事があります。

J2MEゲームを書いた私の経験から、ゲームループの記述が不十分だと、電話の電池がすぐに消耗する可能性があるため、ゲームループで何をするかを最小限に抑える必要があります。つまり、10ミリ秒ごとにレンダリングする場合は、何かが変更されているかどうかを確認し、変更されていない場合はスキップしてください。

于 2009-06-18T03:57:02.533 に答える
1

10ミリ秒ごとにレンダリングすることにした場合は、次のようにします。

loop {
  - record current time; render
  - do input/logic
  - check the current time, and calculate elapsed time
    - if less than 10 ms has elapsed, calculate the remaining time (10 millis - elapsed time); sleep for this duration
}

タイマーの解決に問題がある可能性があることを理解しています(たとえば、Thread.sleep(10)は正確に10ミリ秒スリープしない可能性があり、System.currentTimeMillis()は1ミリ秒までの粒度で結果を返さない可能性があります)。これはプラットフォームに依存します。

于 2009-06-18T03:49:28.490 に答える