网络规格与技巧
Udon 中的网络可能具有挑战性!在经验丰富之前,尽量保持简单。
规格
带宽限制
注意:所有规格都可能发生变化。你可以在调试菜单 6 中查看每个对象使用的数据的具体信息。
- Udon 脚本每秒可以发送约 11 KB 的数据。
- 手动同步的 Udon 脚本每次序列化限制约为 280,496 字节。
- 连续同步的 Udon 脚本每次序列化限制约为 200 字节。
如果世界超出限制,其网络将变得堵塞(参见 IsClogged)。根据 UdonBehaviour 的同步类型,效果不同:
- 连续同步的 behaviour 将无法引发网络事件并在日志中写入错误。
- 手动同步的 behaviour 将缓存事件并重试。 在这两种情况下,UdonBehaviour 的逻辑将继续工作,但数据将不会被发送或接收。
尝试设计脚本以减少所需的网络 量。例如:如果对象将沿固定或可预测路径移动,则其位置可能不需要同步。相反,其初始位置、速度和出发时间可能就足够了。
连续同步
连续同步适用于频繁更改且中间值无关紧要的数据,例如不规则移动的变换的位置。VRChat 执行中间值近似以恢复丢失的数据,并将尝试优化连续同步的网络数据。
连续同步每次序列化限制约为 200 字节。
手动同步
手动同步适用于更新不频繁但快速且中间值很重要的变量。例如,棋盘上棋子的位置应手动同步。
每个手动同步的对象根据数据大小进行速率限制。发送的数据越多,发送速率限制越严格。脚本可以随意调用 RequestSerialization,但 Udon 将等待足够的时间过去,然后才调用 OnPreSerialization、发送数据并调用 OnPostSerialization 返回结果。
手动同步每次序列化限制为 280,496 字节。
可同步变量
这些变量可用于跨网络同步。
在下面的列表中,"size"指的是内存中的近似大小。通过网络传输时,数据被序列化,这可能导致传输更多数据。例如,同步 bool 将发送至少 1 字节的数据(而不是 1 位)加上任何网络开销。
要了解序列化数据有多少字节,请在 OnPostSerialization 事件中使用 byteCount。
布尔类型
| 类型 | 大小 |
|---|---|
| bool | 1 字节 |
整数数值类型
| 类型 | 范围 | 大小 |
|---|---|---|
| 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 × 10^(−45) 到 ±3.4 × 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 字节 |
颜色结构
| 类型 | 范围 / 精度 | 大小 |
|---|---|---|
| Color | 与 float 相同 | 16 字节 |
| Color32 | 与 byte 相同 | 4 字节 |
文本类型和结构
| 类型 | 范围 | 大小 |
|---|---|---|
| char | U+0000 到 U+FFFF | 2 字节 |
| string | 与 char 相同 | 2 字节/字符 |
其他结构
| 类型 | 范围 | 大小 |
|---|---|---|
| VRCUrl | U+0000 到 U+FFFF | 2 字节/字符 |
多个 UdonBehaviour
如果对象上有多个 UdonBehaviour,同步方法将默认为最严格的设置——同一对象上的手动 UdonBehaviour 和连续 UdonBehaviour 都将表现为手动同步。
同步数组
当同步带有同步数组变量的 behaviour 时——确保始终将这些数组初始化为某个值,例如空数组。如果任何同步数组未初始化,behaviour 将不会同步!你可以通过 OnPostSerialization 节点检查序列化是否成功。
可见对象的优先级
Udon 的网络优先同步当前对本地用户可见的同步游戏对象。
Udon定期检查同步对象的所有网格渲染器子项的可见性。这用于 Udon 网络负载均衡的服务质量行为。