Skip to main content

网络规格与技巧

Udon 中的网络可能具有挑战性!在经验丰富之前,尽量保持简单。

规格​

带宽限制​

note

注意:所有规格都可能发生变化。你可以在调试菜单 6 中查看每个对象使用的数据的具体信息。

  • Udon 脚本每秒可以发送约 11 KB 的数据。
  • 手动同步的 Udon 脚本每次序列化限制约为 280,496 字节。
  • 连续同步的 Udon 脚本每次序列化限制约为 200 字节。

如果世界超出限制,其网络将变得堵塞(参见 IsClogged)。根据 UdonBehaviour 的同步类型,效果不同:

  • 连续同步的 behaviour 将无法引发网络事件并在日志中写入错误。
  • 手动同步的 behaviour 将缓存事件并重试。 在这两种情况下,UdonBehaviour 的逻辑将继续工作,但数据将不会被发送或接收。

尝试设计脚本以减少所需的网络量。例如:如果对象将沿固定或可预测路径移动,则其位置可能不需要同步。相反,其初始位置、速度和出发时间可能就足够了。

连续同步​

连续同步适用于频繁更改且中间值无关紧要的数据,例如不规则移动的变换的位置。VRChat 执行中间值近似以恢复丢失的数据,并将尝试优化连续同步的网络数据。

连续同步每次序列化限制约为 200 字节。

手动同步​

手动同步适用于更新不频繁但快速且中间值很重要的变量。例如,棋盘上棋子的位置应手动同步。

每个手动同步的对象根据数据大小进行速率限制。发送的数据越多,发送速率限制越严格。脚本可以随意调用 RequestSerialization,但 Udon 将等待足够的时间过去,然后才调用 OnPreSerialization、发送数据并调用 OnPostSerialization 返回结果。

手动同步每次序列化限制为 280,496 字节。

可同步变量​

这些变量可用于跨网络同步。

note

在下面的列表中,"size"指的是内存中的近似大小。通过网络传输时,数据被序列化,这可能导致传输更多数据。例如,同步 bool 将发送至少 1 字节的数据(而不是 1 位)加上任何网络开销。 要了解序列化数据有多少字节,请在 OnPostSerialization 事件中使用 byteCount。

布尔类型​

类型大小
bool1 字节

整数数值类型​

类型范围大小
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 × 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 字节

文本类型和结构​

类型范围大小
charU+0000 到 U+FFFF2 字节
string与 char 相同2 字节/字符

其他结构​

类型范围大小
VRCUrlU+0000 到 U+FFFF2 字节/字符

多个 UdonBehaviour​

如果对象上有多个 UdonBehaviour,同步方法将默认为最严格的设置——同一对象上的手动 UdonBehaviour 和连续 UdonBehaviour 都将表现为手动同步。

同步数组​

当同步带有同步数组变量的 behaviour 时——确保始终将这些数组初始化为某个值,例如空数组。如果任何同步数组未初始化,behaviour 将不会同步!你可以通过 OnPostSerialization 节点检查序列化是否成功。

可见对象的优先级​

Udon 的网络优先同步当前对本地用户可见的同步游戏对象。

Udon定期检查同步对象的所有网格渲染器子项的可见性。这用于 Udon 网络负载均衡的服务质量行为。