半固定または完全固定のタイムステップ?


15

私はiPhone shmupを作成しており、使用するゲームループのタイプを決定しようとしています。半固定のタイムステップまたは完全に固定のタイムステップを使用したい。

タイムステップが半固定の場合、0回以上のupdate(FIXED_INTERVAL)呼び出しを行い、その後、ゲームループごとにdt <= FIXED_INTERVALのupdate(dt)呼び出しを1回行います。私が理解しているように、この方法の欠点は、更新ごとに変数dtを仮定する必要があるため、物理update(dt)ロジックのプログラミングがより難しくなることです。そして、毎回同じではない浮動小数点値のために、ゲームの各実行がわずかに異なることも耳にしました。

次に、完全に固定されたタイムステップを使用して、0回以上のupdate(FIXED_INTERVAL)呼び出しを行い、その後、ゲームループごとにdt <FIXED_INTERVALの補間(dt / FIXED_INTERVAL)呼び出しを1回行います。

だから、私が本当にしなければならない大きな決断は、変数dtを使ってupdate(dt)を実装するという課題に取り組むのか、補間を実装するという課題に取り組むのか、ということです。

今、私が読​​んだことから、大部分の人々は完全に修正されたものを使って補間を行うと言っています。しかし、補間の実装について考えると、変数dtを使用したupdate(dt)よりもはるかに複雑になりそうです。これは、補間を使用する場合、前の状態と現在の状態の両方を記憶する必要があるためです。したがって、補間を使用する場合は、個々のゲーム状態全体を抽象化する追加の間接レイヤーを作成する必要があります。補間を使用する必要がない半固定タイムステップでは、ゲーム状態の抽象化を考え出す必要はありません。ゲーム状態は常に1つだけであり、単に敵と敵を表す「グローバルアレイ」であるためです。弾丸など

それで、より実用的な選択は何ですか:物理的な更新が変数dtで複雑になる可能性があることを知って、半固定で実装しますか?または、補間を実行するために以前の状態と現在の状態を追跡できるように、完全に固定された状態を使用してゲーム状態の抽象化を試みますか?


ここではかなり徹底的に覆われた:gamedev.stackexchange.com/questions/1589/...
michael.bartnett

1
私はその議論とリンクを何度も読みました。それが実際に私がこの投稿に来た方法です。私の質問は主に、補間を達成するためにゲームの状態を実装する方法に関するものです-これについてはまったく説明しません。
ライアン

回答:


12

完全に修正済み

フレームごとに可変ステップをスローすると、固定タイムステップの利点のほとんどが失われます。

Noel Lopisは、ゲームのCasey's Contraptionsで固定時間ステップをどのように実装たかについて素晴らしい記事を書いています。おまけとして、彼はiPhone開発者ですが、彼の手法はiPhone固有ではありません。

記事のハイライト

  • 時間アキュムレーターを使用します。
  • 60Hzのフレームレートには120Hzの物理レートを使用します。
  • 将来への1つの固定ステップをシミュレートし、残り時間の累積を使用して、現在の物理状態と将来の物理状態の間で描画コードを強引にします。
  • さまざまな落とし穴

2

「半固定」および「完全に固定された」タイムステップと呼ばれるものは、私の考えでは、両方とも固定タイムステップです。コールに渡すdtupdateはフレーム間で変化しません。

それで、あなたの質問は実際には「レンダリングの目的で補間を実装したいのですか?」です。答えは、おそらくそうではありません

補間は、固定updateタイムステップがターゲットrenderタイムステップと著しく異なる場合にのみ実行したいことです。激しいupdateフェーズがありupdate、たとえば10Hzでのみ呼び出すが、フルフレームレートでレンダリングするゲームは珍しくありません。

あなたはiPhone shmupを書いているので、あなたupdateもあなたのrender必要も特にCPUに集中しているわけではありません。フレームレートを30Hzまたは60Hzに簡単にロックでき、実装に煩わされることなく、スムーズに見えるゲームを実現できます。


わかりません。ゲームループで計算する大きなdtをロックできると言っている-私の物理が消費するものですか?それ、どうやったら出来るの?CADisplayLinkでできますか?つまり、私が使用していると仮定すると、CPUの何パーセントですか?ロックされたゲームループdtを本当に想定すべきですか?
ライアン

私が言っていることは、実際にはこれに要約されます:動作する最も簡単なことをしてください。
ブレアホロウェイ

1
推敲:変数を使用dtするためにupdateしてrender働くだろう最も単純なことですが、それが引き起こす不安定性のための物理エンジンを使用した場合、一般的に避けます。したがって、update固定で呼び出しdt、同じレートでレンダリングする(update実行時間が長くなるとフレームをドロップする)ことは、一般的に最も簡単なことです。update呼び出し間でオブジェクトを補間するコードを記述すると、コードが複雑になります。特に問題を解決するために追加する複雑さ。
ブレアホロウェイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.