基础网络同步知识——VRChatNetworking到底是如何工作的?
同步模式
VRChat的同步分为4种同步模式 ”自动“,”手动变量同步“,”连续变量同步“,”事件同步“
————
自动:
自动同步是VRChat最底层的同步模式,自动同步的每一个改变都会立即被同步,同步速度仅取决于网络延迟。
这个是VRChat最快的同步模式,但是只有两个可以享受这种待遇
- Avatars :包括其碰撞体,音效和 IK 动作 (译者注:就是骨骼的位置)
- VRCObjectSync:包括物体的变换组件(Transform) 和刚体组件 (Rigidbody)内的所有信息,不包括其他组件(不包括Udon)
而且VRCObjectSync内部自带平滑函数,使得同步看上去十分流畅快速,这点从带有SYNC的PickUp脚本中可以体现。在实践中,Sync脚本大概率会和PickUp,刚体这两个组件一同出现。
(当然,也有时候会使用Sync的特点。将Sync挂载的物体的Transform值作为9float的同步变量,为手动同步或者没有同步的脚本提供连续快速同步的功能。)
需要注意:VRCObjectSync要求与其在同一物体上的Udon组件必须要以Continuous(连续同步)模式运行。
————
事件同步:
事件同步是Udon的一个独立的同步模式,其允许脚本使用SendCustomNetworkingEvent()方法来触发自身以及远端玩家(Owner/所有玩家)的事件。在3-8-1版本,VRChat官方为事件系统提供了带参网络事件,使得事件同步已经成为了一个完整的同步方案。
事件同步有以下特点:
1:可靠—事件同步通过TCP协议进行同步,保证事件一定抵达。
2:缓慢—事件同步需要等待网络事件帧到来才会开始同步。
3:即时—只有在发送的那一刻存在在房间内的玩家才会收到事件同步。后续到来的玩家不会收到同步。
事件同步时独立于Udon参数同步的同步方式,可以与手动同步和连续同步一同使用。
————
Udon参数同步方法
连续同步(Continuous Variable):
连续同步是Udon两种参数同步模式的其中一种,VRChat会尝试在每一次变量同步帧中同步变量。但是:
1:连续同步不一定会每一次都同步,有可能会因为节省带宽等原因减少同步频率,或者不同步其中的某几次。
2:连续同步不保证每一次都会到达,当丢包发生时,连续同步不会尝试重新发送同步包。直到主机下一次发生变化。
3:连续同步保证所有玩家都能收到最新的同步结果(在不丢包的情况下)——包括后加入的玩家。
4:连续同步的带宽极低,整个游戏的连续同步带宽仅200字节。
5:连续同步仅支持最多126个字符的字符串/字符数组。
连续同步比较常用与对数据精度要求不高,数据量不高但是对即时性要求很高的场景。即使是连续同步同步延迟也大概率大于1second,所以需要搭配手写平滑函数来减少同步频率低带来的卡顿感。
手动同步(Manual Variable)
手动同步是Udon两种参数同步模式的其中一种,VRChat会立即序列化所有的同步变量,并且在下一次同步帧到来时将同步数据发送出去。
手动同步是最常用的同步模式,也是我最推荐的同步模式。它有如下的特点:
1:可控—手动同步的发送,打包,解包都有相对应的事件存在,你可以自定义同步的流程
2:可靠—手动同步相对于连续同步,没有VRChat的介入,不会因为各种各样的原因导致包被丢弃,可以认为是可靠的。
3:低速—虽然手动同步和连续同步共享了同一个网络同步通道,但是由于需要手动触发,等待网络帧,所以速度相对较低。
4:高带宽—连续同步的单次最高同步为49千字节只要低于这个值都可以在一个网络帧内发送,如果高于则会分两次进行同步。
在后续的设计模式中,我们也会大多数以手动同步为同步方案。
——————
在VRChat中玩家
当B玩家为Owner,A玩家SetOwner。当A出发SetOwner的时候,A玩家会停止帧生成,A玩家向B玩家发送OnOwnershipRequest()事件,B玩家返回是否允许本次Owner转移,A玩家收到结果后切换Owner状态并通过OnOwnershipTransferred()事件来通知所有玩家Owner已经转移。然后继续执行下一条指令
No comments to display
No comments to display