ネットワーク越しの物理同期について

Last updated 5 months ago

はじめに

私自身も実はインターネット越しの物理の同期を行ったことはないため、あくまで参考になりそうなものをご紹介する程度になります。(ローカルのネット環境であれば問題無く同期できています)

物理同期の難しいところ

物理同期の難しいところは実は物理同期の実装そのものよりも、通信量が多いこととシリアライズ・デシリアライズの負荷が高いことです。実装は基本的には定期的にオブジェクトの位置や回転を送って同期するだけです。

それらをいかに削減し、間引き、補間するかというのが問題となります。詳しいことは Gaffer On Games の Networked Physics を見てください。私が作ったネットワークのフレームワークでの実装もこれを参考にしています。

すでにある実装としては、Unreal Engine 4 の Networking や、 Photon、 Monobit Engine が参考になるかもしれません。(私はあまり詳しくないのですが……。)

物理同期における TCP の問題点

インターネットの世界においては、パケットロスが発生する可能性があります。そのような環境において TCP を使うと Head-of-Line Blocking という現象により目詰まりを起こす可能性があります。これは、TCP がパケットロスを検出したときに、ロスした部分が来るまで、ロスした部分から先が来ていたとしても無かったことにしてしまうために起こります。

TCP を使う限りこの問題は避けられません。物理同期においては、最新の物さえきちんと受け取れれば間がロスしていてもかまわないので、UDP で通信をするのが基本となるでしょう。

ちなみに、この TCP の問題は Web の世界にも影響を与えていて、Google は QUIC というプロトコルを作ったりしています。

このあたりも詳しくは Gaffer On Games の UDP vs. TCP を見てください。

ネットワークゲームの作り方全体については Gaffer On Games の他 IT Hare on Soft.ware の D&D of MOGs もとても参考になります。