ここにいくつかの読み物があります(gamedev固有のStackExchangeサイトがあります、BTW):
これらの記事で最も重要なポイントの 1 つは、特定のフレーム数ではなく、時間の経過とともに特定の速度で移動することです。フレーム レートは予期せず変化する可能性があるため、時間ベースの動きとフレーム ベースの動きが互いに同等になることはありません。
そして、ここにいくつかの説明があります...
そのため、コンピューターと OS はマルチスレッド化されているため、アプリの外部で何が起こっているのか、マシンの全体的な負荷が何であるかを知ることはできません。このため、フルスクリーン モードであっても、CPU に排他的にアクセスすることはできません。これが、物事が速くなったり遅くなったりする理由の 1 つです。
Slick2D でのデルタの目的は、このスピードアップ/スローダウンに対処できるようにし、アプリがフレームレートを動的に変更できるようにして、画面上の知覚される動きがマシンの負荷によって変化しないようにすることです。デルタはモニターのリフレッシュレートではありません(これは一定です)。デルタは、 への最後の呼び出しから経過したミリ秒数ですupdate
。
では、このデルタを適切に使用するにはどうすればよいでしょうか。背景が 100 ピクセル/秒の速度で移動することになっているとしましょう。デルタ ( への特定の呼び出しでupdate
) が 33 ミリ秒の場合、この更新で背景を移動する必要がある量は、背景を 0.033 ピクセル移動する100*(33/1000.0) = 0.033
ことになります。これは奇妙に思えるかもしれませんし、1 ピクセル未満で移動することのポイントが何であるか疑問に思うかもしれませんが、私に固執してください。
まず、1000 ではなく 1000.0 で除算する必要がある理由は、デルタの動きによって浮動小数点数が得られるようにするためです。
Slick2D の 2D グラフィックスは float 値を使用して配置を追跡していることに気付くでしょう。これは、デルタが何かを 0.033 ピクセル移動するように指示している場合、それを 0.033 ピクセル移動する必要があるためです。つまり、0 ピクセルでも 1 ピクセルでもありません。サブピクセルの動きは、フレームレートの増加/減少を滑らかにするためにも重要です。これは、いくつかのサブピクセルの動きに対する累積的な影響により、適切なタイミングでこれらの小さな動きがすべて合計されてピクセル全体になるためです。それは完全に滑らかで、正しい全体的な移動速度をもたらします。
画面はサブピクセル要素ではなく特定のピクセルに画像を解決するため、サブピクセルの動きをしても問題ないと思うかもしれませんが、すべての動きの追跡をフロートに変換すると、あなたが観察している効果がほとんどなくなることを確認してください。