Networking Specs & Tricks
Udonでのネットワーク実装は難しい場合があります。慣れるまではシンプルな構成を心がけましょう。
Specs
Bandwidth limits
注意: すべての仕様は変更される可能性があります。オブジェクトごとに使用されるデータの詳細については、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)
| 型 | サイズ |
|---|---|
bool | 1バイト |
整数型 (Integral numeric types)
| 型 | 範囲 | サイズ |
|---|---|---|
sbyte | -128 ~ 127 | 1バイト |
byte | 0 ~ 255 | 1バイト |
short | -32,768 ~ 32,767 | 2バイト |
ushort | 0 ~ 65,535 | 2バイト |
int | -2,147,483,648 ~ 2,147,483,647 | 4バイト |
uint | 0 ~ 4,294,967,295 | 4バイト |
long | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 8バイト |
ulong | 0 ~ 18,446,744,073,709,551,615 | 8バイト |
浮動小数点数型
| 型 | 概算範囲 | 精度 | サイズ |
|---|---|---|---|
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)
| 型 | 範囲 | サイズ |
|---|---|---|
| Vector2 | floatと同じ | 8バイト |
| Vector3 | floatと同じ | 12バイト |
| Vector4 | floatと同じ | 16バイト |
| Quaternion | floatと同じ | 16バイト |
色構造体
テキスト型および構造
| 型 | 範囲 | サイズ |
|---|---|---|
char | U+0000 〜 U+FFFF | 2 バイト |
string | char と同じ | 2 バイト / 文字 |
その他の構造
| 型 | 範囲 | サイズ |
|---|---|---|
| VRCUrl | U+0000 〜 U+FFFF | 2 バイト / 文字 |
複数の UdonBehaviour
同一オブジェクト上に複数の UdonBehaviour がある場合、同期メソッドは最も制限の厳しい設定が優先されます。Manual の UdonBehaviour と Continuous の UdonBehaviour が同じオブジェクト上にある場合、両方とも Manual として動作します。
配列の同期
同期配列変数が設定された UdonBehaviour を同期させる際は、それらの配列を必ず何らかの値(空の配列など)で初期化してください。同期配列のいずれかが未初期化のままだと、その UdonBehaviour は同期されません。シリアライズの成功可否は OnPostSerialization ノードで確認できます。
表示オブジェクトの優先順位
Udonのネットワーク機能は、ローカルユーザーから現在見えている同期済みゲームオブジェクトを優先します。
Udonは、同期済みオブジェクトのすべての子Mesh Rendererの可視性を定期的にチェックします。これは、Udonのネットワーク負荷分散におけるサービス品質(QoS)の動作に使用されます。
最終更新: