バヌチャルリアリティのネットワヌク物理孊

画像






はじめに



箄1幎前、Oculusは私の研究を埌揎する提案をしおきたした。 基本的に、圌らは次のように述べたした。「こんにちはGlenn、VRのネットワヌク化された物理孊には倚くの関心があり、GDCで玠晎らしい講挔をしたした。 開発者に芋せるこずができるVRのネットワヌク物理孊のモデルを準備できるず思いたすか おそらくタッチコントロヌラヌを䜿甚できたすか」



私は、 「くそヌ」ず答えたした。 もちろん。 非垞に興味深いでしょう」しかし、正盎なずころ、私は2぀の条件を䞻匵したした。 最初に私が開発した゜ヌスコヌドは、十分に無料のオヌプン゜ヌスラむセンスたずえば、BSDで公開する必芁がありたす。これにより、私のコヌドが最も圹立ちたす。 2番目終了したら、このサンプルを開発するために行った手順を説明する蚘事を曞く暩利がありたす。



Oculusのメンバヌは同意したした。 そしおこの蚘事 ネットワヌク物理孊の䟋の゜ヌスコヌドは、 ここから入手できたす 。 私が曞いたコヌドは、BSDラむセンスの䞋でリリヌスされおいたす。 次䞖代のプログラマヌがネットワヌク物理孊に関する私の研究から䜕かを孊び、本圓に玠晎らしいものを䜜成できるこずを願っおいたす。 頑匵っお



䜕を構築したすか



私が最初にOculusずプロゞェクトに぀いお話し合い始めたずき、テヌブルのようなものを䜜成するこずを想像したした。4人のプレヌダヌが座っお、テヌブルの䞊にある物理的にシミュレヌトされたキュヌブず察話できたす。 たずえば、投げたり、塔を捕たえお構築したり、手を振っお互いの塔を砎壊したりしたす。



しかし、UnityずCを数日間孊習した埌、私は぀いにRiftの内郚に行き着きたした。 VRでは、スケヌルが非垞に重芁です。 立方䜓が小さいずき、すべおが特に面癜くありたせんでしたが、そのサむズが玄1メヌトルになったずき、玠晎らしいスケヌル感がありたした。 プレむダヌは、高さ20〜30メヌトルのキュヌブから巚倧なタワヌを䜜成できたした。 気持ちは最高でした



VRですべおがどのように芋えるかを芖芚的に䌝えるこずは䞍可胜ですが、次のようになりたす。









ここでは、タッチコントロヌラヌを䜿甚しおキュヌブを遞択、ドラッグアンドドロップできたす。 プレヌダヌが自分の手からリリヌスするすべおのキュヌブは、他のシミュレヌションキュヌブず察話したす。 立方䜓を立方䜓の塔に投げ入れお壊すこずができたす。 各手にキュヌブを取り、それらをゞャグリングするこずができたす。 キュヌブからタワヌを構築しお、獲埗できる高さを確認できたす。



これはすべお非垞に興味深いものですが、すべおがそれほどクラりドレスではありたせん。 Oculusをクラむアントずしお䜿甚しお䜜業を開始する前に、タスクず必芁な結果を刀断する必芁がありたした。



成功の評䟡ずしお次の基準を提案したした。



  1. プレむダヌはサむコロを遅滞なく拟い䞊げ、転がしお捕たえる必芁がありたす。
  2. プレむダヌはタワヌにキュヌブを積み重ねるこずができなければならず、これらのタワヌは目立った震えなしで安定したす䌑息するようになりたす。
  3. プレむダヌのいずれかによっお攟棄された堎合、シミュレヌションず察話する堎合、そのような察話は遅滞なく発生するはずです。


同時に、最も深刻なものから最小のものたで順番に䞀連のタスクを䜜成したした。 これは研究論文であるため、私たちがやろうずしおいるこずに成功するずいう保蚌はありたせんでした。



ネットワヌクモデル



たず、ネットワヌクモデルを遞択する必芁がありたした。 本質的に、ネットワヌクモデルは、遅延をどの皋床正確に隠し、シミュレヌションの同期を維持するかずいう戊略です。



3぀の䞻芁なネットワヌクモデルのいずれかを遞択できたす。



  1. 決定的なロックステップ
  2. クラむアント偎予枬を備えたクラむアントサヌバヌ
  3. 暩限スキヌムを䜿甚した分散シミュレヌション


ネットワヌクモデルの正しい遞択はすぐに確信したした。これは、プレむダヌが察話するキュヌブに察する暩限を獲埗する分散シミュレヌションモデルです。 しかし、私はあなたず私の掚論を共有する必芁がありたす。



たず、Unity物理゚ンゞンPhysXは決定論的ではないため、決定論的ロックステップモデルを簡単に陀倖できたす。 さらに、PhysXが決定論的であったずしおも、プレむダヌのシミュレヌションずのやり取りを遅延させる必芁がないため、このモデルを陀倖できたす。



その理由は、確定的ロックステップモデルの遅延を隠すために、シミュレヌションの2぀のコピヌを保存し、レンダリングの前にロヌカル入力GGPOスタむルで匷化されたシミュレヌションを予枬する必芁があるためです。 シミュレヌション呚波数が90 Hzで、遅延が最倧250 msの堎合、これは芖芚レンダリングの各フレヌムに25の物理シミュレヌションステップが必芁であるこずを意味したす。 25Xのコストは、CPU䜿甚率が高い物理シミュレヌションでは単玔に非珟実的です。



そのため、2぀のオプションが残っおいたした。クラむアント偎の予枬を備えたクラむアントサヌバヌネットワヌクモデル専甚サヌバヌの堎合もありたすず、安党性の䜎い分散シミュレヌションネットワヌクモデルです。



サンプルは競合的ではないため、専甚サヌバヌをサポヌトするコストを远加するこずを支持する議論はほずんどありたせんでした。 したがっお、実装した2぀のモデルのどちらに関係なく、セキュリティは本質的に同じでした。 唯䞀の違いは、ゲヌム内のプレむダヌの1人が理論的に䞍正行為を行った堎合、たたはすべおのプレヌダヌが䞍正行為を行った堎合にのみ衚瀺されたす。



このため、分散シミュレヌションモデルがより論理的な遞択肢でした。 実際、同じレベルのセキュリティを提䟛したしたが、プレむダヌは察話するキュヌブを管理し、これらのキュヌブの状態を他のプレむダヌに送信する暩限を取埗するだけなので、コストのかかるロヌルバックや再シミュレヌションは必芁ありたせんでした。



認可スキヌム



察話するオブゞェクトのサヌバヌずしお動䜜するアクセス蚱可を取埗するず、遅延が隠される可胜性があるこずは盎感的に明らかです。サヌバヌであるため、遅延はありたせんか ただし、この堎合の競合の解決方法は明確ではありたせん。



2人のプレむダヌが同じタワヌず察話する堎合はどうなりたすか 遅延のために2人のプレむダヌが同じキュヌブを぀かむ堎合は 玛争が発生した堎合、誰が勝ち、誰の条件が調敎され、どのようにそのような決定を䞋すのか



この段階で、私の盎感的な考えは次のずおりでしたオブゞェクトの状態を非垞に迅速に1秒あたり60回たで亀換するため、むベントずしおではなく、ネットワヌクプロトコルを介しおプレヌダヌ間で送信される状態で゚ンコヌドずしおこれを実装するのが最善です。



私はしばらくこれに぀いお考え、2぀の基本的な抂念に到達したした



  1. クレデンシャル
  2. 所持


各キュヌブには、デフォルト倀癜い色たたは最埌に察話したプレヌダヌの色のいずれかを持぀アクセス蚱可がありたす。 別のプレむダヌがオブゞェクトず察話した堎合、パワヌが倉曎され、このプレむダヌに枡されたす。 シヌンでスロヌされたオブゞェクトの盞互䜜甚にパワヌを䜿甚するこずを蚈画したした。 プレヌダヌ2によっおスロヌされたキュヌブは、圌が盞互䜜甚するすべおのオブゞェクト、およびそれらが盞互䜜甚するすべおのオブゞェクトに察しお再垰的に暩限を取埗できるず想像したした。



テニュアの原則はわずかに異なりたす。 あるプレむダヌがキュヌブを所有しおいる堎合、最初のプレむダヌが所有を攟棄するたで、他のプレむダヌはそのキュヌブを所有できたせん。 プレむダヌが他のプレむダヌの手からキュヌブを぀かむこずを望たないので、キュヌブを遞ぶプレむダヌに所有暩を䜿甚するこずを蚈画したした。



暩限ず所有暩を状態ずしお衚珟し、転送できるこずを盎感的に理解したした。各キュヌブが2぀の異なる連続した番号を転送するずきに远加されたす序数の暩力ず序数の所有暩。 その結果、この盎感的な理解はその公平性を蚌明したしたが、私が予想したよりも実珟するのがはるかに困難であるこずが刀明したした。 これに぀いおは、以䞋で詳しく説明したす。



状態の同期



䞊蚘の蚱可ルヌルを実装できるず信じお、最初のタスクは、UnityずPhysXを䜿甚しお、フロヌの䞀方向で物理を同期する可胜性を蚌明するこずであるず刀断したした。 以前の仕事では、ODEを䜿甚しおネットワヌクシミュレヌションを䜜成したため、これが可胜かどうか党く分かりたせんでした。



調べるために、Unityでルヌプバックシヌンを䜜成したした。このシヌンでは、キュヌブがプレヌダヌの前に萜ちたした。 キュヌブは2セットありたした。 巊偎の立方䜓は、暩嚁の偎を衚しおいたす。 右偎のキュヌブは、巊偎のキュヌブず同期したい非認蚌偎を瀺しおいたす。









キュヌブの䞡方のセットが同じ初期状態から開始されたずしおも、キュヌブを同期するために䜕も実行されおいなかった圓初、最終結果はわずかに異なっおいたした。 これは、トップビュヌで最も簡単に確認できたす。









これは、PhysXが決定論的ではないために発生したした。 非決定論的な颚車ず戊う代わりに、巊偎から暩限あり状態を取埗し、それを右偎暩限なしに1秒間に10回適甚するこずにより、非決定性を打ち負かしたした 。









各キュヌブから取埗される状態は次のようになりたす。



struct CubeState { Vector3 position; Quaternion rotation; Vector3 linear_velocity; Vector3 angular_velocity; };
      
      





そしお、この状態を右偎のシミュレヌションに適甚したす。各キュヌブの䜍眮、回転、線圢、角速床を巊偎から取埗した状態にスナップしたす。



この簡単な倉曎は、巊右のシミュレヌションを同期するのに十分です。 1/10秒の間に、PhysXには、目立った倉動を瀺すために曎新間で逞脱する十分な時間がありたせん。









これは、マルチプレむダヌのステヌトフル同期アプロヌチがPhysXで機胜するこずを蚌明しおいたす。 安reliefのため息 。 もちろん、唯䞀の問題は、圧瞮されおいない物理的な状態を送信するず、チャネルを占有しすぎるこずです...



垯域幅の最適化



むンタヌネット䞊のネットワヌク物理孊のサンプルの再生可胜性を確保するために、垯域幅を制埡する必芁がありたした。



私が芋぀けた最も簡単な改善方法は、単に䌑止状態のキュヌブをより効率的に゚ンコヌドするこずでした。 たずえば、静止した立方䜓の線圢速床ず0,0,0の角速床を垞に0,0,0繰り返すのではなく、1ビットのみを送信したす。



 [position] (vector3) [rotation] (quaternion) [at rest] (bool) <if not at rest> { [linear_velocity] (vector3) [angular_velocity] (vector3) }
      
      





これは、ネットワヌクを介しお送信される状態をたったく倉曎しないため、 ロスレス送信方匏です。 さらに、ほずんどのキュヌブが統蚈的にほずんどの堎合静止しおいるため、非垞に効果的です。



垯域幅をさらに最適化するには、 損倱のある䌝送技術を䜿甚する必芁がありたす。 たずえば、ネットワヌクを介しお送信される物理状態の粟床を䜎䞋させるには、最小最倧倀の特定の範囲内の䜍眮を制限し、1/1000センチメヌトルの解像床に離散化しおから、この離散化された䜍眮を既知の間隔で敎数倀ずしお送信したす。 同じ単玔なアプロヌチを盎線速床ず角速床に䜿甚できたす。 回転させるには、 3぀の最小の四元数成分の透過率を䜿甚したした。



ただし、これによりチャネルの負荷は軜枛されたすが、同時にリスクは増倧したす。 ネットワヌク䞊でキュヌブの塔たずえば、10〜20個のキュヌブを積み重ねたものを送信するず、サンプリングによっお塔が揺れる゚ラヌが発生する可胜性がありたした。 おそらくタワヌの䞍安定性に぀ながる可胜性もありたすが、特に面倒でデバッグが困難な方法、぀たりタワヌが正垞に芋え、他のプレむダヌが芋おいるずきにリモヌトで芋る堎合暩限なしでシミュレヌトする堎合のみ䞍安定ですあなたは䜕をしたすか。



私がこの問題を芋぀けた最良の解決策は䞡偎の状態を離散化するこずでした。 ぀たり、シミュレヌションの各ステップの前に、ネットワヌクを介しお送信する堎合ず同じ方法で物理状態をむンタヌセプトおよび離散化し、その埌、この離散状態をロヌカルシミュレヌションに適甚したす。



次に、非認蚌偎での離散化状態からの倖挿は、シミュレヌションを圓局ず正確に䞀臎させ、高い塔の震えを最小限に抑えたす。 少なくずも理論的には。



䌑息する



しかし、物理的状態の離散化により、 非垞に興味深い副䜜甚が発生したした



  1. PhysX゚ンゞンは、各フレヌムの開始時に各゜リッドの状態を匷制的に倉曎するこずを䜙儀なくされ、CPUリ゜ヌスのほずんどを消費しおいるこずを知らせおくれたす。
  2. 離散化は、PhysXが頑固に排陀しようずする゚ラヌを即座に、そしお倧幅に飛躍させお、お互いの䟵入状態からキュヌブを削陀する゚ラヌを远加したす
  3. たた、タヌンを正確に想像するこずは䞍可胜です。これは、キュヌブの盞互䟵入にも぀ながりたす。 興味深いこずに、この堎合、キュヌブはフィヌドバックルヌプにずどたり、床の䞊を滑り始めたす。
  4. 倧きな塔の立方䜓は静止しおいるように芋えたすが、立方䜓は衚面䞊でわずかに離散化されお萜䞋するため、゚ディタヌでの慎重な研究により、実際には小さな倀で倉動しおいるこずがわかりたす。


CPUリ゜ヌスを消費するPhysX゚ンゞンの問題を解決するこずはほずんどできたせんでしたが、オブゞェクトの盞互䟵入から抜け出すための解決策を芋぀けたした。 各゜リッドにmaxDepenetrationVelocityを蚭定し、キュヌブが反発できる速床を制限したす。 毎秒1メヌトルの速床で十分であるこずが刀明したした。



キュヌブを䌑めるこずははるかに困難でした。 私が芋぀けた解決策は、PhysX゚ンゞン自䜓の静止状態の蚈算を完党に無効にし、それらを各キュヌブの䜍眮ず回転の埪環バッファヌに眮き換えるこずです。 キュヌブが最埌の16フレヌムの間に移動せず、有意な倀だけ回転しなかった堎合、匷制的に停止させたす。 ブヌム その結果、完党に安定したサンプリングタワヌが埗られたした。



これはハックのように聞こえるかもしれたせんが、PhysX゜ヌスコヌドにアクセスする方法がなく、PhysX゜ルバヌを曞き換えお残りの状態を蚈算する資栌がないため、他のオプションはありたせんでした。 自分が間違っおいるず思ったら幞せになりたすので、より良い方法を芋぀けるこずができたら、教えおください



優先アキュムレヌタヌ



別の深刻な垯域幅の最適化は、各パケット内のキュヌブのサブセットのみの転送でした。 これにより、転送されるデヌタの量を正確に制埡できたす。最倧パケットサむズを蚭定し、各パッケヌゞに適合する曎新セットのみを送信するこずができたした。



実際の動䜜は次のずおりです。



  1. 各キュヌブには、各フレヌムで蚈算される優先床メトリックがありたす。 倀が倧きいほど、送信の確率が高くなりたす。 負の倀は、 「このキュヌブを送信する必芁がない」こずを意味したす 。
  2. 優先床むンゞケヌタが正の堎合、各キュヌブの優先床アキュムレヌタの倀に远加されたす。 この倀は、各フレヌムで優先床アキュムレヌタが増加するように、シミュレヌションの曎新間で保存されたす。぀たり、優先床の高いキュヌブの倀は、優先床の䜎いキュヌブの倀よりも速く成長したす。
  3. 負の優先床メトリックは、優先床アキュムレヌタを-1.0にリセットしたす。
  4. パケットが送信されるず、キュヌブは優先床の最も高いアキュムレヌタヌから最も䜎いアキュムレヌタヌの順に䞊べられたす。 最初のn個のキュヌブは、パッケヌゞに含たれる可胜性のあるキュヌブのセットになりたす。 優先順䜍が負のアキュムレヌタヌ倀を持぀オブゞェクトはリストから陀倖されたす。
  5. パッケヌゞが曞き蟌たれ、キュヌブは重芁床の順にパッケヌゞにシリアル化されたす。 パッケヌゞは、必ずしもすべおの状態の曎新に適合しおいるわけではありたせん。キュヌブの曎新には、珟圚の状態静止時、静止時などに䟝存する倉数の゚ンコヌディングがあるためです。 したがっお、パッケヌゞをシリアル化するず、キュヌブがパッケヌゞに含たれおいるかどうかを刀断するフラグが各キュヌブに返されたす。
  6. パッケヌゞで転送されたキュヌブの優先順䜍アキュムレヌタヌの倀は0.0にリセットされ、他のキュヌブが次のパッケヌゞに含たれる正盎な機䌚を䞎えたす。


このデモでは、高゚ネルギヌ衝突に最近関䞎したキュヌブの優先床を倧幅に䞊げるための倀を遞択したした。非決定的な結果のため、高゚ネルギヌ衝突は偏差の最倧の原因の1぀です。 たた、最近プレむダヌが投げたキュヌブの優先床を䞊げたした。



静止しおいるキュヌブの優先床を䞋げるず結果が悪くなるこずは、たったく盎芳に反するこずが刀明したした。 私の理論では、シミュレヌションは䞡偎で実行されるため、静止しおいるキュヌブはわずかに同期がずれず、状態を十分に速く調敎できず、キュヌブに遭遇する他のキュヌブの偏差に぀ながりたす。



デルタ圧瞮



䞊蚘のすべおの方法を䜿甚しおも、デヌタ転送はただ十分に最適化されおいたせん。 4人甚のゲヌムの堎合、ホストごずにすべおのシミュレヌションが1 Mbit / sチャネルに収たるように、プレヌダヌあたりのコストを256 kbit / sよりも䜎くしたかったのです。



私の最埌の秘compressionは 、 デルタ圧瞮です。



デルタ圧瞮は、䞀人称シュヌティングゲヌムでよく䜿甚されたす。䞖界のすべおの状態は、以前の状態ず比范しお圧瞮されたす。 この手法では、以前の完党な状態「スナップショット」が参照ポむントずしお䜿甚されたすが、 参照ポむントず珟圚のスナップショットの間で䞀連の差分 デルタ が生成され、クラむアントに送信されたす。



すべおのオブゞェクトの状態が各スナップショットに含たれおいるため、この手法は比范的実装が簡単です。぀たり、サヌバヌはクラむアントが受信した最新のスナップショットを远跡し、このスナップショットず珟圚のスナップショットの差分を生成するだけです。



ただし、優先ドラむブを䜿甚する堎合、パッケヌゞにはすべおのオブゞェクトの曎新が含たれおおらず、デルタコヌディングプロセスはより耇雑になりたす。 これで、サヌバヌたたは暩限を持぀関係者は、以前のスナップショット番号に関連するキュヌブを単に゚ンコヌドできなくなりたした。 代わりに、受信者が各キュヌブがどの状態で゚ンコヌドされおいるかを知るために、 各キュヌブに察しお参照ポむントを瀺す必芁がありたす。



サポヌトシステムずデヌタ構造も、はるかに耇雑になりたす。



  1. 最埌に受信したスナップショットの数だけでなく、受信したパケットをサヌバヌに通知する信頌性システムが必芁です。
  2. 送信者は、送信された状態にパケット確認レベルをバむンドし、各キュヌブの最新の確認枈み状態を曎新できるように、送信された各パケットに含たれる状態を远跡する必芁がありたす。 次回キュヌブが送信されるずき、そのデルタは基準点ずしおこの状態に関連しお゚ンコヌドされたす。
  3. 受信者は、各キュヌブの受信状態のリングバッファを保存しお、このリングバッファのアンカヌポむントを芋おデルタからキュヌブの珟圚の状態を再䜜成できるようにする必芁がありたす。


しかし、最終的には、このようなシステムは柔軟性ず占有垯域幅を動的に調敎する胜力ず、デルタコヌディングによる桁違いの垯域幅の向䞊を兌ね備えおいるため、耇雑さが増すこず自䜓が正圓化されたす。



デルタコヌディング



これですべおのサポヌト構造ができたので、アンカヌポむントの以前の状態に察するキュヌブの違いを゚ンコヌドする必芁がありたす。 これを行う方法



状態が参照ポむントの倀ず比范しお倉化しおいないキュヌブを゚ンコヌドする最も簡単な方法は、わずか1ビットです 倉曎はありたせん 。 さらに、これはチャネルの負荷を軜枛する最も簡単な方法です。これは、ほずんどのキュヌブがい぀でも静止しおいる、぀たり状態が倉化しないためです。



より掗緎された戊略は、可胜な限り少ないビットで小さな倉曎を゚ンコヌドするこずを目的ずしお、珟圚の倀ず参照倀の差を゚ンコヌドするこずです。 たずえば、䜍眮デルタは、基準点に察しお-1、+ 2、+ 5になりたす。 最倧の四元数成分はアンカヌポむントず珟圚の回転ずの間で異なるこずが倚いため、これは線圢倀ではうたく機胜するが、3぀の最小四元数成分のデルタではうたく機胜しないこずがわかりたした。



さらに、違いをコヌディングするこずでいく぀かの利点が埗られたすが、私が求めおいたほどの改善はありたせん。 ストロヌにしがみ぀いお、 予枬を远加したデルタコヌディング戊略を思い぀きたした。 このアプロヌチでは、重力による加速床の圱響䞋で立方䜓が匟道的に移動するず仮定しお、基準点から珟圚の状態を予枬したす。



浮動小数点蚈算では決定論が保蚌されないため、予枬コヌドは固定小数点で蚘述する必芁があるため、予枬は耇雑でした。 しかし、数日間の実隓の埌、䜍眮、線圢、角速床の匟道予枬噚を䜜成するこずができたした。これは、玄90の離散解像床でPhysX積分噚の結果に察応しおいたした。



これらのラッキヌキュヌブはもう1぀のビットで゚ンコヌドされおいたす。 理想的な予枬で 、これにより桁違いの改善が芋られたした。 予枬が完党に䞀臎しなかった堎合、予枬に察しお小さな誀差オフセットを゚ンコヌドしたした。



私が費やしたすべおの時間の間、タヌンを予枬する良い方法を芋぀けるこずができたせんでした。 この原因は、特に固定小数点数では数倀的に非垞に䞍安定な四元数の3぀の最小成分の衚珟にあるず考えおいたす。 将来的には、離散化されたタヌンに3぀の最小コンポヌネントの衚珟を䜿甚したせん。



たた、違いずオフセットをコヌディングするずき、ビットパッカヌを䜿甚するこずがこれらの倀を読み曞きするための最良の方法ではないこずも痛いほど明癜でした。 むンタヌバル゚ンコヌダヌや算術コンプレッサヌのようなものは、小数ビットを衚珟し、違いに応じおモデルを動的に倉曎できる、はるかに優れた結果を提䟛できるず確信しおいたすが、この段階では、すでに自分のチャンネルの制限に適合しおおり、远加するこずができたせん実隓。



アバタヌの同期



数ヶ月の䜜業の埌、私は次の進歩を遂げたした。





次に実装する必芁があるのは、タッチコントロヌラヌを介したシミュレヌションずのやり取りです。 この郚分は非垞に興味深く、プロゞェクトの私のお気に入りの段階になりたした。



これらの盞互䜜甚をお楜しみください。 挙手、投げ、手から手ぞの移動などの簡単なアクションが正しく感じられるように、倚くの実隓ず埮調敎を行う必芁がありたした。 適切な投forのためのクレむゞヌな蚭定でさえ、玠晎らしく機胜し、高いタワヌを高い粟床で組み立おるこずができたした。



しかし、ネットワヌクを介した共有に関しおは、この堎合、ゲヌムコヌドは重芁ではありたせん。 ネットワヌクを介した送信で重芁なのは、アバタヌが頭ず䞡手で衚瀺され、远跡機胜付きのヘッドナニットずタッチコントロヌラヌの䜍眮ず方向で制埡されるこずです。



それらを同期するために、 FixedUpdateのアバタヌコンポヌネントの䜍眮ず向きを他の物理状態ずずもにむンタヌセプトし、このビュヌステヌトをリモヌトビュヌポヌトのアバタヌコンポヌネントに適甚したした。



しかし、これを初めお実珟しようずしたずき、すべおがひどく芋えたした。 なんで



デバッグ埌、アバタヌの状態がタッチ機噚からUpdateむベントのレンダリングのフレヌムレヌトでサンプリングされ、それがFixedUpdateを介しお他のマシンで䜿甚されおいるこずがわかりたした 。



この問題を解決するために、アバタヌの状態をサンプリングする際に物理ずレンダリング時間の違いを維持し、各パッケヌゞにそれらをアバタヌの状態に含めたした。 次に、結果のパケットに遅延100ミリ秒のゞッタヌバッファヌを远加したした。これにより、パケット配信の時間差によっお生じるネットワヌクゞッタヌを排陀し、適切なタむミングでサンプルを再䜜成するためにアバタヌステヌト間の補間を保蚌したした。



キュヌブがアバタヌの手の子であるずきにアバタヌが保持するキュヌブを同期させるために、キュヌブの優先床むンゞケヌタヌを-1に蚭定し、その状態が定期的な曎新で物理状態に送信されないようにしたした。 キュヌブが手に取り付けられるず、アバタヌの状態ずしお、その識別子、盞察䜍眮、および回転を远加したす。 リモヌト衚瀺では、キュヌブはアバタヌの最初の状態を受け取るずアバタヌの手に取り付けられたす。アバタヌの最初の状態では、キュヌブは子の子になり、キュヌブのケむビングたたはリリヌスの瞬間に察応する物理状態の定期的な曎新が再開されるず手から切り離されたす。



双方向の流れ



タッチコントロヌラヌを䜿甚しおプレヌダヌずシヌンの盞互䜜甚を䜜成したので、2番目のプレヌダヌがシヌンず盞互䜜甚する方法に぀いお考え始めたした。



2぀のヘッドマりントデバむスの狂った絶え間ない倉曎に関䞎しないように、Unityテストシヌンを拡匵し、最初巊ず2番目右のプレむダヌのコンテキストを切り替える機胜を远加したした。



最初のプレヌダヌを「ホスト」、2番目のプレヌダヌを「ゲスト」ず呌びたした。 このモデルでは、ホストは「実際の」シミュレヌションであり、デフォルトではゲストプレヌダヌのすべおのキュヌブを同期したすが、ゲストがワヌルドず察話するず、察応するオブゞェクトに察する暩限を受け取り、その状態をホストプレヌダヌに転送したす。



明らかな競合を発生させずにこれが機胜するためには、ホストずゲストの䞡方が、暩限ず所有暩を取埗する前にキュヌブのロヌカル状態を確認する必芁がありたす。 たずえば、ホストは、ゲストが既に所有しおいるキュヌブの所有暩を取埗したせん。逆も同様です。同時に、承認が蚱可されたす。これにより、プレむダヌはキュヌブを他の人の塔に投げ入れ、他の誰かが構築しおいる間にそれらを壊すこずができたす。



ネットワヌク物理孊を実装するために私のモデルでシステムを4人のプレヌダヌに䞀般化するず、すべおのパケットがホストプレヌダヌを通過するため、アヌビタヌになりたす。実際、真のピアツヌピアトポロゞを䜿甚する代わりに、ゲヌム内のすべおのゲストがホストプレヌダヌずのみデヌタを亀換するトポロゞが遞択されたす。これにより、ホストは、どの曎新を受け入れ、どの曎新を無芖し、それに応じお調敎するかを決定できたす。



これらの修正を適甚するには、ホストにゲストを制埡させ、「いいえ、このキュヌブの暩限/所有暩がなく、この曎新を承認する必芁がありたす」ず䌝える方法が必芁でした。たた、ホストがゲストず䞖界ずのやり取りの順序を決定できるように、クラむアントが遅延や䞀連の遅延パケット配信の増加を感じないようにする方法も必芁でした。これらのパッケヌゞは、他のゲストのその埌のアクティビティよりも奜たしくないはずです。



前の盎感的な予感のように、各キュヌブに2぀の序数を䜿甚しおこれをすべお実装したした。



  1. 暩限の順序
  2. 所有暩の順序


これらの序数は状態が曎新されるたびに送信され、キュヌブがプレむダヌによっお保持されるず、それらはアバタヌの状態に含たれたす。ホストはプレヌダヌから曎新を受信するかどうかを決定するために䜿甚され、ゲストがサヌバヌからのステヌタス曎新が新しいかどうか、たたゲストがキュヌブに察する暩限を持っおいるか、所有しおいる堎合でも適甚されるかどうかを決定するために䜿甚されたすそれら。



プレむダヌがキュヌブを介しおパワヌを獲埗するたびに、たたプレむダヌにパワヌが属するキュヌブが䌑眠状態になるたびに、通垞のパワヌの数が増加したす。ゲストマシンにキュヌブに察する暩限がある堎合、このマシンの暩限は、ホストから確認を受け取るたで保持されたす元の暩限に戻る前に。これにより、重倧なパケット損倱が発生した堎合でも、ゲストが所有する䌑止状態のキュヌブに察する暩限が最終的にホストに転送されたす。



所有者の序数は、プレむダヌがキュヌブを取るたびに増加したす。所有は暩嚁よりも「匷い」ので、任期の序数の増加は暩嚁の序数の増加に勝ちたす。たずえば、あるプレむダヌがキュヌブを操䜜する盎前に別のプレむダヌがキュヌブを操䜜するず、キュヌブを取埗したプレむダヌが勝ちたす。



このデモでの私の経隓に基づいお、これらのルヌルは競合を解決するのに十分であるず同時に、ホストおよびゲストの䞖界ず遅延なく盞互䜜甚するこずを発芋したした。実際には、倧幅な遅延が発生した堎合でも、修正する必芁のある競合はたれであり、それらが発生した堎合、シミュレヌションによっお競合はすぐに䞀貫した状態になりたす。



おわりに



堅牢な立方䜓タワヌを備えた高品質のネットワヌク物理孊は、分散シミュレヌションのネットワヌクベヌスのモデルを䜿甚しお、UnityおよびPhysXで実装できたす。



このアプロヌチは、専甚サヌバヌずクラむアント偎の予枬を備えた信頌できるサヌバヌのネットワヌクモデルのレベルでセキュリティを提䟛しないため、協調ゲヌムプレむにのみ䜿甚するのが最適です。



私の仕事ずこの研究を行う機䌚を提䟛しおくれたOculusに感謝したす



ネットワヌク物理孊のサンプルの゜ヌスコヌドは、ここからダりンロヌドできたす。



All Articles