フレームレートはゲームエンジンの速度に影響しますか?


7

私は楽しみのために2Dゲームエンジンを書いています。エンジンを使用してアニメーションを実行できます。ただし、フレームレート(1秒あたりのフレーム数)を変更すると、アニメーションの速度が変わります。

ゲームエンジンを使用したことがありません。他のゲームエンジンがこの問題を処理しているかどうかを知りたいです。そうでない場合、2Dゲームの理想的なフレームレートはどのくらいですか?

回答:


13

いいえ、フレームレートは速度に影響しません。ゲームプレイはビデオパフォーマンスに完全に依存します。これは悲惨です(速度を制限しても、システムがゲームを半分の速度で実行するユーザーを制御することはできません)。

あなたが何か間違ったことをしたためにこの問題が発生しています:更新/レンダリングルーチンは可能な限り高速で次々と実行され、オブジェクトは呼び出しごとに更新されます(したがって、呼び出し速度が逸脱すると、その速度も変わります)。

時間ベースのアプローチ

これを行う正しい方法は、1秒ごとにオブジェクトを更新することです。

たとえば、弾丸について考えてみましょう。今のところ、おそらくフレームごとにどれだけ移動する必要があるかわかっています。これを1秒あたりの移動量に変換する必要があります。その方法は実際にはそれほど複雑ではありません。

まず、弾丸は1秒に複数回更新されるため、実際には数ミリ秒ごとに更新する必要があります。物理エンジンを更新するたびに、最後の更新から特定のミリ秒数が経過しました。これはデルタ時間と呼ばれ、通常は短縮してdtです。dtはすべてのオブジェクトを更新する前に決定され、すべてのオブジェクトは同期を保つために同じdtを使用して更新されます。dtは通常、更新呼び出しで各オブジェクトの引数として渡されます。

固定ステップの物理学では、dtは固定数ですが、可変ステップの物理学では、dtは最後の更新以降の実際の時間に応じて変化します(そのため、その名前です)。

これで弾丸に戻ります。物理エンジンが毎秒60回更新されるdtは16ミリ秒で更新するように言われています。弾丸が毎秒12メートル移動する場合、(16.0/1000.0) * 12.0この更新で弾丸を移動します。


4
このアプローチは、多くの理由で理想的ではありません。ゲームプレイは非決定的であり、マルチプレイヤーの同期は本来よりもはるかに困難になります。更新速度が十分に遅くなると、オブジェクトがバリアを通り抜けるか、発生するはずの衝突がスキップされる可能性があります。
AttackingHobo

これが、経過時間(dt)をクランプできる理由です。つまり、1秒あたりのフレーム数5-1000から、エンジンは正しく動作します。5fps未満では、時間が遅くなります(つまり、dtがクランプされます)。
deceleratedcaviar

@Daniel、それはまだ非決定的であり、同期されたネットワークシミュレーション、または再生システムの実装がはるかに困難です。また、ルーブゴールドバーグタイプのパズルゲームを作成した場合、数秒後にシミュレーションが毎回同じように再生されなくなります。
AttackingHobo

ああ、なんらかの理由で、dtステッピングで固定タイムステップを使用していると思いました...だから、これは悪いことです。
deceleratedcaviar

5
公平に言うと、このアプローチは複雑な物理演算を実行しないものには十分すぎるほどであり、出荷されている多くのゲームで機能しています。あまりになどの固定時間ステップと補間レンダリングを、必要とする心配を取得しないことが最善ですそれはそう
Kylotan

10

すべてのシステムでゲームを同じ速度で実行する最良の方法は、固定タイムステップを使用することです。

タイムステップが固定されているため、レンダリングレートが何であっても、ゲームは常に同じレートで更新され、補間を使用すると、レンダリングレートが更新レートよりはるかに高い場合でもスムーズに見えます。

これは、固定タイムステップを実装する方法に関するリソースを使用した回答です。
半固定または完全固定のタイムステップ?

これは、動きと変換のための補間を実装する方法を説明する答えです。
2つのゲーム状態を補間する方法は?


-2

いいえ、それはすべきではありません。ゲームで実行できるタイミングの1つは、フレームベースのタイミングです。アイデアは、コンピューターが実行できるのと同じくらい速くゲームループを実行させ、それによって全体的なエクスペリエンスを強化し、シミュレーションの実行速度を制御することです。これで、更新をレンダリングから切り離し、それを正確に制御できるようになりました。

このシナリオでは、ゲームループは1台のマシンでは60 fps、別のマシンでは45かそれと異なる可能性がありますが、シミュレーションは常にそれらの間で指定された正確なレートで実行されます。

ゲームは2つのセクションに分かれています。1つはグラフィックスのレンダリング用、もう1つはシミュレーションの更新用です。ゲームの開始時に希望のシミュレーションレートを設定し、ゲームループの上部で経過時間を取得します。この経過時間は、目的のシミュレーションレートに基づく時間量であることに注意してください。この値は、ゲームオブジェクトに対する乗数として使用され、それらを希望のシミュレーションレートで、または非常に近くに移動し続けます。たとえば、シミュレーションを30 fpsで更新し、ゲームループが現在60 fpsで実行されている場合、このフレームの経過時間の値は0.5になります。これに移動オブジェクトの速度を掛けると、30 fpsで移動します。フレームごとにゲームのループ速度が大きく異なり、フレームベースのタイミングによってシミュレーションを既知の予測可能な速度で実行し続けることができることを理解してください。

その結果、滑らかで滑らかなアニメーションになります。


1
-1これは、(私の回答とAttackingHoboで説明されているように)固定ステップの更新ですが、秒単位のような直感的な測定ではなく、フレーム単位のレートで処理を行います。これまでのところ、これは秒単位で物事を実行し、秒単位の速度とフレーム単位の速度の間で変換する直感的ではないすべての暗算を節約するための小さなステップです(そして、あなたはたまたまあなたのフレームレートを変更します)。
doppelgreener 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.