while(true)
すべてがループで行われるユーザー入力に基づいて、アニメーション化されたスプライトを移動するプログラムを作成しました。これまで私がループのタイミングを計っていた唯一の方法はsleep(20)
、各実行の最後にループを通過させることです。velocity = velocity + GRAVITY * Elapsed-Time
重力を計算するための式がであり、ループが一定の速度で実行されていないため、重力の影響も一貫していないため、これがスプライトの物理に悪影響を与えることに気づきました。ループを一貫して実行し続ける方法、またはループが実際にスケジュールどおりに実行されるようにタイミングを調整するより良い方法はありますか?
質問する
211 次
2 に答える
2
まず、フレームの長さを決定します。30 fpsが必要な場合は、
final long frameDuration = 1000 / 30;
次に、レンダリングを開始するときに、次のように時間を保存します
final long then = System.currentTimeMillis();
render(); // surely it's more than this but you get the idea
final long now = System.currentTimeMillis();
final long actualDuration = now - then;
final long sleepDuration = frameDuration - actualDuration;
if(sleepDuration > 0) {
sleep(sleepDuration);
} else {
throw new FrameTooLongException();
}
于 2012-07-20T17:06:19.157 に答える
0
velocity = velocity + GRAVITY * Elapsed-Time
これは、フレームレートが一定であるかどうかに関係なく機能するはずです。秘訣は、経過時間を正確かつ一貫して測定することです。ループ内のあるポイントから次のループ内の同じポイントまでの経過時間を測定します。
于 2012-07-20T17:15:22.460 に答える