しばらくゲームの開発に携わった後、可変フレーム レート (最後のティックから経過した時間を計算し、それに応じてアクターの動きを更新する) と固定フレーム レート (時間を計算する) の両方に触れてきました。一定時間経過するか、次のウィンドウが来るまでスリープするかを選択します)。
特定の状況に最適な方法はどれですか? 考えてください:
- さまざまなシステム仕様へのケータリング。
- 開発/保守の容易さ;
- 移植の容易さ;
- 最終公演。
しばらくゲームの開発に携わった後、可変フレーム レート (最後のティックから経過した時間を計算し、それに応じてアクターの動きを更新する) と固定フレーム レート (時間を計算する) の両方に触れてきました。一定時間経過するか、次のウィンドウが来るまでスリープするかを選択します)。
特定の状況に最適な方法はどれですか? 考えてください:
私は可変フレームレート モデルに傾倒していますが、内部的には一部のシステムが固定タイムステップで動作しています。これは、タイム アキュムレータを使用すると非常に簡単に実行できます。物理演算は、固定されたタイムステップで実行するのが最適なシステムの 1 つであり、必要に応じてフレームごとに複数回ティックして、安定性の損失を回避し、シミュレーションをスムーズに保ちます。
アキュムレータの使用方法を示すコード:
const float STEP = 60.f / 1000.f;
float accumulator = 0.f;
void Update(float delta)
{
accumulator += delta;
while(accumulator > STEP)
{
Simulate(STEP);
accumulator -= STEP;
}
}
これは決して完璧ではありませんが、基本的な考え方を示しています。このモデルを改善するには多くの方法があります。入力フレームレートが異常に遅い場合、明らかに解決すべき問題があります。ただし、大きな利点は、デルタがどれほど速くても遅くても、シミュレーションが「プレーヤー時間」でスムーズに移動することです。これは、ユーザーが問題を認識する場所です。
通常、私はグラフィックスとオーディオの側面には触れませんが、物理演算、入力、およびネットワーク コードほど影響を受けるとは思いません。
ほとんどの3D開発者は可変FPSを好むようです。Quake、Doom、Unrealエンジンは、システムパフォーマンスに基づいてスケールアップとスケールダウンの両方を行います。
パフォーマンスが重要なネットワーク化された3Dゲームを作成している場合は、弾丸を噛み、可変フレームレートを実装する必要があります。
2Dパズルゲームの場合は、固定フレームレートで問題を解決できる可能性があります。おそらく、超低速のコンピューターや来年のモデル用にわずかにパラメーター化されています。
ユーザーとして私がもっと頻繁に見たいオプションの1つは、フレームレートが証明書のエンベロープの外側で変化するときに、詳細レベルを動的に変更することです(技術的な意味だけでなく広い意味で)。5FPSでレンダリングしている場合は、バンプマッピングをオフにします。90FPSでレンダリングしている場合は、ベルとホイッスルを少し増やして、CPUとGPUを無駄にするためにユーザーにきれいな画像を提供します。
正しく行われた場合、ユーザーは設定画面に移動して自分自身を微調整することなく、ゲームから最高の体験を得ることができます。また、レベルデザイナーとして、異なるシーン間でポリゴン数を同じに保つことについて心配する必要はありません。 。
もちろん、私はこれをゲームのユーザーとして言いますが、それは深刻なものではありません。重要なゲームを作成しようとしたことは一度もありません。
可変長フレーム時間に関して私が遭遇した主な問題は浮動小数点の精度であり、可変フレーム時間はその噛み付き方に驚くかもしれません。
たとえば、フレーム時間 * 速度を位置に追加していて、フレーム時間が非常に短くなり、位置が大きくなった場合、精度のためにすべてのデルタが失われるため、オブジェクトが遅くなったり、動きが止まったりする可能性があります。別のエラー アキュムレータを使用してこれを補正できますが、面倒です。
フレーム時間を固定 (または少なくともフレーム長の下限) にすることで、考慮に入れる必要がある FP エラーの量を制御できます。
私の経験は、やや単純なゲーム(SDLとC ++で開発されたもの)にかなり限定されていますが、静的フレームレートを実装するだけで非常に簡単であることがわかりました。2Dまたは3Dゲームを使用していますか?より複雑な3D環境では、可変フレームレートのメリットが大きくなり、難易度が高くなると思います。