パフォーマンスに関する考慮事項
はじめに
VRChatにおけるマルチプレイヤー体験を円滑にするには、効率的なネットワーク通信が不可欠です。最適化が不十分なネットワークオブジェクトは、帯域幅の使用量増加、ラグ、同期ズレといった問題を引き起こす可能性があります。本ガイドでは、ネットワークロジックを最適化するためのベストプラクティスを紹介します。
変数とイベントの使い分け
変数(同期されたデータ)
すべてのプレイヤー間で同期が必要な永続的な状態には、同期された変数を使用してください。例:
- ゲーム内のプレイヤーのスコア
- ドアの開閉状態
- 後から参加したプレイヤーが利用可能である必要があるすべてのデータ
ベストプラクティス:
- わずかな更新が頻繁に発生する場合(例:プログレスバー)のみ Continuous Sync を使用してください。
- 常に正確である必要があるデータ(例:リーダーボード)には Manual Sync を使用してください。
- 同期された変数の過度な使用は避けてください。同期メッセージが多すぎると帯域幅のスパイクを引き起こす可能性があります。
イベント(一時的なアクション)
永続性が必要なく、後から参加したプレイヤーが受け取る必要もない一回限りのアクションには、イベントを使用してください。例:
- ボタンが押されたときにアニメーションを再生する
- 銃を発射したり、効果音を鳴らしたりする
- 一時的な視覚効果を発生させる
ベストプラクティス:
SendCustomNetworkEvent(NetworkEventTarget.All, "EventName")の使用は控えめにしてください。- 状態の永続化にイベントを使用することは避けてください(例:同期変数を使わずにドアを開いた状態に設定する)。
- ネットワーク通信が不要なエフェクトについては、ローカルのみで完結するロジックを検討してください。
帯域幅使用量の削減
不要な同期を避ける
- ネットワークオブジェクトの更新を制限する: 値が大きく変化したときのみ更新を送信するようにします。
- 物理演算の相互作用を最適化する: 必要でない限り
rigidbodyをネットワーク経由で同期させないでください。 - interpolation(補間)や extrapolation(予測)を使用する: 頻繁に位置情報を送信する代わりに、これらを使用して動きを滑らかにします。
変数の同期を最適化する
- 関連する変数をまとめる: 可能であれば配列にまとめます。
- 浮動小数点の精度を最小限にする: (例:不必要に高い精度の値を同期させることは避けてください)
- バイナリフラグを使用する: 複数の真偽値(boolean)を同期させる場合は、ビットフラグを使用します。
オーナーシップとオブジェクト同期のベストプラクティス
- オーナーシップの移譲は、必要な場合にのみ行ってください(例:
pickupなどのインタラクティブなオブジェクトの場合)。 - オーナーシップの頻繁な切り替えは、遅延や同期ズレの原因となる可能性があるため、避けてください。
パフォーマンスのテストとデバッグ
- デバッグGUI(
--enable-debug-gui)を使用して、帯域幅と同期の動作を監視してください。 - 実際のマルチプレイヤー環境でテストを行い、異なるレイテンシ環境でのネットワークの挙動を確認してください。
- ネットワークメッセージをプロファイリングして、冗長なデータ送信を最小限に抑えてください。
次のステップ
ネットワークの最適化に関する詳細な知見については、以下の関連ガイドを参照してください。
最終更新: