VRChat 非公式日本語ドキュメント

Networking Specs & Tricks

Udonでのネットワーク実装は難しい場合があります。慣れるまではシンプルな構成を心がけましょう。

Specs

Bandwidth limits

note

注意: すべての仕様は変更される可能性があります。オブジェクトごとに使用されるデータの詳細については、Debug Menu 6で確認できます。

  • Udonスクリプトは、1秒あたり約11 kilobytesを送信できます。
  • Manual sync(手動同期)を使用するUdonスクリプトは、シリアライズ1回あたり約280,496 bytesに制限されています。
  • Continuous sync(継続的同期)を使用するUdonスクリプトは、シリアライズ1回あたり約200 bytesに制限されています。

ワールドが制限を超えると、ネットワークが詰まった状態(IsCloggedを参照)になります。これはUdonBehaviourの同期タイプによって異なる影響を及ぼします:

  • Continuous(継続的)な動作の場合、ネットワークイベントの発生に失敗し、ログにエラーが書き込まれます。
  • Manual(手動)な動作の場合、イベントがキャッシュされ、再試行されます。 どちらの場合もUdonBehaviourのロジック自体は機能し続けますが、データは送受信されません。

スクリプトは、必要なネットワーク通信量を削減するように設計してください。例えば、オブジェクトが固定または予測可能な軌道で動く場合、その位置情報を同期させる必要はないかもしれません。代わりに、初期位置、速度、出発時刻の情報だけで十分な場合があります。

連続同期 (Continuous synchronization)

連続同期は、頻繁に変化し、かつ中間的な値が重要ではないデータ(不規則に動くTransformの位置など)に適しています。VRChatは、失われたデータを補完するために中間値の近似処理を行い、連続同期のためのネットワークデータを最適化しようと試みます。

連続同期は、1回のシリアライズあたり約200バイトに制限されています。

手動同期 (Manual synchronization)

手動同期は、更新頻度は低いものの、更新時に即時性が求められ、中間的な値が重要となる変数に適しています。例えば、チェスボード上の駒の位置などは手動で同期させるべきです。

手動同期される各オブジェクトは、データサイズに応じてレート制限を受けます。送信量が多いほど、送信レートの制限も厳しくなります。スクリプトから RequestSerialization を呼び出す頻度に制限はありませんが、Udon は十分な時間が経過するまで待機してから OnPreSerialization を呼び出し、データを送信し、その結果とともに OnPostSerialization を呼び出します。

手動同期は、シリアライズごとに 280,496バイト に制限されています。

同期変数 (Synced Variables)

これらの変数は、ネットワーク経由で同期するために利用できます。

以下のリストにおける「サイズ」は、メモリ上での概算サイズを指します。ネットワーク経由で同期する際はデータがシリアライズされるため、送信データ量が増加する場合があります。例えば、bool を同期する場合、ネットワークオーバーヘッドに加えて少なくとも1バイトのデータが送信されます(1ビットではありません)。 シリアライズされたデータが何バイトであったかを確認するには、OnPostSerialization イベント内の byteCount を使用してください。

ブール型 (Boolean types)

サイズ
bool1バイト

整数型 (Integral numeric types)

範囲サイズ
sbyte-128 ~ 1271バイト
byte0 ~ 2551バイト
short-32,768 ~ 32,7672バイト
ushort0 ~ 65,5352バイト
int-2,147,483,648 ~ 2,147,483,6474バイト
uint0 ~ 4,294,967,2954バイト
long-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,8078バイト
ulong0 ~ 18,446,744,073,709,551,6158バイト

浮動小数点数型

概算範囲精度サイズ
float±1.5 x 10^(−45) ~ ±3.4 x 10^(38)約6~9桁4バイト
double±5.0 × 10^(−324) ~ ±1.7 × 10^(308)約15~17桁8バイト

ベクトル演算型および構造体 (Unity)

範囲サイズ
Vector2floatと同じ8バイト
Vector3floatと同じ12バイト
Vector4floatと同じ16バイト
Quaternionfloatと同じ16バイト

色構造体

範囲 / 精度サイズ
Colorfloat と同じ16 バイト
Color32byte と同じ4 バイト

テキスト型および構造

範囲サイズ
charU+0000 〜 U+FFFF2 バイト
stringchar と同じ2 バイト / 文字

その他の構造

範囲サイズ
VRCUrlU+0000 〜 U+FFFF2 バイト / 文字

複数の UdonBehaviour

同一オブジェクト上に複数の UdonBehaviour がある場合、同期メソッドは最も制限の厳しい設定が優先されます。Manual の UdonBehaviour と Continuous の UdonBehaviour が同じオブジェクト上にある場合、両方とも Manual として動作します。

配列の同期

同期配列変数が設定された UdonBehaviour を同期させる際は、それらの配列を必ず何らかの値(空の配列など)で初期化してください。同期配列のいずれかが未初期化のままだと、その UdonBehaviour は同期されません。シリアライズの成功可否は OnPostSerialization ノードで確認できます。

表示オブジェクトの優先順位

Udonのネットワーク機能は、ローカルユーザーから現在見えている同期済みゲームオブジェクトを優先します。

Udonは、同期済みオブジェクトのすべての子Mesh Rendererの可視性を定期的にチェックします。これは、Udonのネットワーク負荷分散におけるサービス品質(QoS)の動作に使用されます。

最終更新: