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