固定レートのゲーム ロジックはどの更新レートで実行する必要がありますか?
過去に 1 秒あたり 60 回の更新を使用したことがありますが、1 秒あたりの更新数が偶数 (16.666666) ではないため、それは困難です。私の現在のゲームでは 100 を使用していますが、ほとんどの場合、それはやり過ぎのようです。
固定レートのゲーム ロジックはどの更新レートで実行する必要がありますか?
過去に 1 秒あたり 60 回の更新を使用したことがありますが、1 秒あたりの更新数が偶数 (16.666666) ではないため、それは困難です。私の現在のゲームでは 100 を使用していますが、ほとんどの場合、それはやり過ぎのようです。
上記のどれでもない。可能な限りスムーズなゲームプレイを実現するには、ゲームをフレームロックではなく時間ベースにする必要があります。フレームロックは、ロジックを微調整してフレームレートをロックダウンできる単純なゲームで機能します。フレームレートがボード全体にジャンプし、画面がVSyncされていない可能性がある、最新の3Dタイトルではうまくいきません。
あなたがする必要があるのは、オブジェクトがどれだけ速く進むべきか(つまり、1秒あたりの仮想ユニット)を把握し、最後のフレームからの時間を計算し、経過した時間に一致するように仮想ユニットの数をスケーリングすることです。これらの値をオブジェクトの位置に追加します。出来上がり!時間ベースの動き。
以前は Quake3 mod を維持していましたが、これは常にユーザーからの質問の源でした。
Q3 は、デフォルトで 20 の「ティック/秒」を使用します。グラフィック サブシステムが補間するため、画面上で滑らかな動きが得られます。最初はこれはかなり低いと思っていましたが、結果的には問題なく、q3 よりもアクションが速いゲームはほとんどありません。
私は個人的に「ジョン・カーマックには十分、私には十分」に行きます
私は固定レートのPCゲームで50が好きです。私は50と60の違いを実際に見分けることはできません(そして、あなたができる/気にかけるゲームを作っているなら、おそらく100になるはずです)。
質問は「固定レートのゲームロジック」であり、「ループの描画」ではないことに気付くでしょう。わかりやすくするために、コードは次のようになります。
while(1)
{
while(CurrentTime() < lastUpdate + TICK_LENGTH)
{
UpdateGame();
lastUpdate += TICK_LENGTH;
}
Draw();
}
問題は、TICK_LENGTHはどうあるべきかということです。
理想は、モニターと同じリフレッシュレートで実行することです。そうすれば、ビジュアルとゲームの更新が互いに位相がずれたりずれたりすることはありません。各フレームが整数ミリ秒続くわけではないという事実は、あなたにとって重要ではありません。なぜそれが問題なのですか?
私は通常30または33を使用します。多くの場合、ユーザーはフローを感じるだけで十分であり、CPUを過度に占有しないほどまれです。
通常、ゲームのFPSを制限するのではなく、すべてのロジックを変更して、最後のフレームからの経過時間を入力として使用します。
固定金利に関しては、何らかの理由で高金利が必要な場合を除いて、25/30のようなものを使用する必要があります。それは十分なレートであるはずであり、CPU使用率でゲームを少し軽くします。
このような変数は、一般に、推測とチェックの戦略を介して見つけるのが最善です。
リフレッシュにとらわれない方法でゲーム ロジックを実装し (たとえば、ms/update を変数として公開し、それを任意の計算で使用するなど)、リフレッシュが機能するまで試行錯誤してから、そのままにしておきます。
短期的な解決策として、均一な更新レートが必要であるが、1 秒あたりの更新の均一性を気にしない場合、15 ミリ秒は 60 更新/秒に近くなります。両方について考えている場合、最も近いオプションは 20 ミリ秒または 50 更新/秒がおそらく最も近い値です。
どちらの場合でも、ハードコーディングするのではなく、単純に時間を double (または高解像度の long) として扱い、レートを変数としてゲームに提供します。
コードがサイクルまで測定されない限り、各ゲーム ループが完了するまでに同じミリ秒がかかるわけではないことに注意してください。また、1 秒あたり 16.6666 の更新ではなく、ゲーム ループが目標とする平均ミリ秒数です。
エンジンは、「ティック」(更新) し、垂直同期 (vsync) を使用して 60 fps で描画する必要があります。このリフレッシュ レートは、以下を提供するのに十分です。
ゲームの物理とレンダラーの両方が、必要に応じてフレームをドロップできるようにする必要がありますが、ゲームを最適化して、この 60hz 標準にできるだけ近づけて実行します。また、AI などの一部のサブシステムは 10 ~ 20 fps 近くまで刻み込むことができ、次のようにフレーム間のタイム デルタで物理が補間されるようにします。タイムステップ/