質問

J2MEゲームの開発に関する一連の質問を行ってきましたが、最近の質問でニール・コフィーがコメントしました

  

副次的な問題として-本当に欲しいですか   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);
        }
    }
}

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

役に立ちましたか?

解決

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ミリ秒までの粒度で結果を返さない場合があります)。これはプラットフォームに依存します。

他のヒント

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top