J2MEの時間効率の高いGameloop
質問
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ミリ秒ごとにレンダリングする場合は、変更があったかどうかを確認し、変更されていない場合はスキップしてください。
所属していません StackOverflow