ネットワークの仕様とテクニック
Udonにおけるネットワーク処理は非常に難解な場合があります!習熟するまでは、できるだけ単純な構成を保つようにしてください。
仕様
帯域幅の制限
注意: すべての仕様は変更される可能性があります。オブジェクトごとのデータ使用量に関する詳細情報は、Debug Menu 6で確認できます。
- Udonスクリプトは1秒あたり約11キロバイトのデータを送信できます。
- Manual sync(手動同期)を使用するUdonスクリプトは、シリアル化ごとに約280,496バイトに制限されます。
- Continuous sync(継続的同期)を使用するUdonスクリプトは、シリアル化ごとに約200バイトに制限されます。
ワールドが制限を超えると、ネットワークが詰まった状態(IsCloggedを参照)になります。これによる影響は、UdonBehaviourの同期タイプによって異なります。
- Continuousタイプの挙動は、ネットワークイベントの発生に失敗し、ログにエラーが書き込まれます。
- Manualタイプの挙動は、イベントをキャッシュし、再試行を行います。
どちらの場合もUdonBehaviourのロジック自体は動作し続けますが、データは送受信されません。
必要なネットワーク通信量を削減するようなスクリプト設計を心がけてください。例えば、オブジェクトが固定または予測可能なパスに沿って移動する場合、その位置情報を常に同期する必要はないかもしれません。代わりに、初期位置、速度、出発時刻を同期するだけで十分な場合があります。
継続的同期 (Continuous synchronization)
継続的同期は、不規則に動くtransformの位置など、頻繁に変化し、中間の値が重要ではないデータに適しています。VRChatは、失われたデータを補完するために中間値の近似処理を行い、継続的同期のためのネットワークデータを最適化しようとします。
継続的同期は、シリアル化ごとに約200バイトに制限されます。
手動同期 (Manual synchronization)
手動同期は、更新頻度は低いものの素早い更新が必要で、かつ中間の値が重要となる変数に適しています。例えば、チェス盤上の駒の位置などは手動で同期するべきです。
手動同期される各オブジェクトは、データサイズに応じたレート制限を受けます。送信データ量が多いほど、送信レートの制限も厳しくなります。スクリプトから RequestSerialization を何度呼び出しても構いませんが、十分な時間が経過するまでUdonは OnPreSerialization の呼び出し、データの送信、およびその結果に基づく OnPostSerialization の呼び出しを待機します。
手動同期は、シリアル化ごとに280,496バイトに制限されます。
同期変数
これらの変数は、ネットワーク全体で同期するために利用できます。
以下のリストにおいて、「サイズ」はメモリ上の近似サイズを指します。ネットワーク経由でのデータ送信時にはデータがシリアライズされるため、送信されるデータ量はこれより多くなる場合があります。例えば、bool を同期する場合、ネットワークのオーバーヘッドに加えて、最低でも1バイトのデータが送信されます(1ビットではありません)。
シリアライズされたデータが何バイトであったかを確認するには、OnPostSerialization イベントで byteCount を使用してください。
ブール型
| Type | Size |
|---|---|
| bool | 1 byte |
| ### 整数型 |
| Type | Range | Size |
|---|---|---|
| sbyte | -128 to 127 | 1 byte |
| byte | 0 to 255 | 1 byte |
| short | -32,768 to 32,767 | 2 bytes |
| ushort | 0 to 65,535 | 2 bytes |
| int | -2,147,483,648 to 2,147,483,647 | 4 bytes |
| uint | 0 to 4,294,967,295 | 4 bytes |
| long | -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 | 8 bytes |
| ulong | 0 to 18,446,744,073,709,551,615 | 8 bytes |
| ### 浮動小数点型 |
| Type | Approximate range | Precision | Size |
|---|---|---|---|
| float | ±1.5 x 10^(−45) to ±3.4 x 10^(38) | ~6-9 digits | 4 bytes |
| double | ±5.0 × 10^(−324) to ±1.7 × 10^(308) | ~15-17 digits | 8 bytes |
| ### ベクトル演算型および構造体 (Unity) |
| Type | Range | Size |
|---|---|---|
| Vector2 | same as float | 8 bytes |
| Vector3 | same as float | 12 bytes |
| Vector4 | same as float | 16 bytes |
| Quaternion | same as float | 16 bytes |
| ### カラー構造体 |
| Type | Range / Precision | Size |
|---|---|---|
| Color | same as float | 16 bytes |
| Color32 | same as byte | 4 bytes |
| ### テキスト型および構造体 |
| Type | Range | Size |
|---|---|---|
| char | U+0000 to U+FFFF | 2 bytes |
| string | same as char | 2 bytes / char |
| ### その他の構造体 |
| Type | Range | Size |
|---|---|---|
| VRCUrl | U+0000 to U+FFFF | 2 bytes / char |
複数の UdonBehaviours
単一のオブジェクト上に複数の UdonBehaviour が存在する場合、同期メソッドは最も制限の厳しい設定に合わせられます。つまり、Manual と Continuous の UdonBehaviour が同じオブジェクト上にある場合、両方とも Manual として動作します。
配列の同期
同期された配列変数を持つ Behaviour を同期させる際は、それらの配列を必ず空の配列などの値で初期化してください。同期対象の配列が初期化されていない場合、その Behaviour は同期されません!シリアライズが成功したかどうかは OnPostSerialization ノードで確認できます。
可視オブジェクトの優先順位付け
Udon のネットワークは、ローカルユーザーから現在見えている同期済みゲームオブジェクトを優先します。
Udon は、同期オブジェクトのすべての子 Mesh Renderer が表示されているかどうかを定期的に確認します。これは、Udon のネットワーク負荷分散におけるサービス品質(QoS)の動作に使用されます。
最終更新: