最適化
CPUパフォーマンス最適化
オブジェクトプール
デフォルトでは、ネットワークオブジェクトをスポーン/デスポーンする際に、FusionはUnityゲームオブジェクトのインスタンスを生成/破棄します。これは、CPU負荷が高い操作で、メモリ割り当てが発生します。
そのため、独自のNetworkObjectProvider
を使用して、NetworkObject
インスタンスをプールすることを推奨します。
ティックレート
ホスト(サーバー)モードでは、NetworkProjectConfig
からティックレートを下げることで、ゲームプレイコードのCPU使用量を抑えることができます。SendRate
の値は、CPUパフォーマンスには大きな影響を与えません。
メモリ最適化
Fusionは、大量のネイティブメモリをヒープに事前割り当てします。このヒープサイズはNetworkProjectConfig
で設定できます。ヒープの合計サイズはPageCount * PageShift
になります。ヒープは、メモリ内の各ネットワークフレームに割り当てられます。このネットワークステートは補間に使用されるため、常に複数のヒープが割り当てられていることになります。
ネットワークステートが小さいアプリケーションの場合は、安全にメモリを削減することができます。PageCount
とPageShift
を徐々に減らしながら、現実的なシナリオでゲームをテストしましょう。Fusionのメモリが不足すると、OutOfMemoryException
が発生します。(PageShift
は16kb以上にすることを推奨します)
TargetFrameRate
サーバーでは、必ずTargetFrameRate
を設定してください。そうしないと、UnityはCPUを100%使用して可能な限り高いFPSで実行されます。Fusionはゲームプレイシミュレーションを固定ティックレートのFixedUpdateNetwork
で実行するため、これにはまったくメリットがありません。
Application.TargetFrameRate
をFusionのティックレートに合わせる最も簡単な方法は次の通りです。
Application.targetFrameRate = TickRate.Resolve(NetworkProjectConfig.Global.Simulation.TickRateSelection).Server;
帯域幅の最適化Bandwidth Optimization
帯域幅の最適化は、様々な理由から重要です。
- 帯域幅使用料金が減るため、アプリケーション費用が削減できます。
- より多くのプレイヤーが、ネットワーク関連のトラブルなしにゲームをプレイできます。
- Fusionの結果整合性の転送アルゴリズムは、パケットのスナップショットサイズがMTU(Maximum Transmission Unit ~1280 bytes)より小さい場合に、最も効率的に動作します。
インタレストマネジメント
インタレストマネジメントは、帯域を劇的に削減する最良の方法です。これは、ホスト/サーバーモードでも共有モードでも動作します。
- Area of Interestによって、オブジェクトに近いプレイヤーのみに状態を送信できます。
- Interest Management アドオンは、プレイヤーのArea of Interestの形状をさらに最適化する実践的なツールを提供しています。
- Explicit Object Interestによって、帯域消費が激しいオブジェクトを調整できます。
送信レート
NetworkProjectConfig
でFusionの送信レートを下げると、2/4/8ティックおきにネットワークで状態を送信するようになります。送信レートの削減は、ゲームプレイシミュレーション(例:物理)の質に影響を与えずに、帯域幅を削減する良い方法です。
文字列の回避
RPCやネットワークプロパティで、文字列の使用(特にjson・xml・その他の類似フォーマット)を避けてください。
かわりに独自のINetworkStruct
を使用して、データをバイト効率が良い構造で表現してください。
信頼性のあるストリーミングAPI
大きなデータをRPCで送信することは避けて、かわりにデータストリーミングAPIを使用してください。データストリーミングの使用方法については、このページをご覧ください。
Back to top