最小化网络带宽

由于与游戏的其他方面相比,网络通信可能较缓慢,因此将其减到最小是很重要的。因此考虑您要交换的数据量以及交换发生的频率是很重要的。

数据是如何同步的

网络带宽的使用量大部分取决于您是否使用不可靠的可靠的差值压缩 (Reliable Delta Compression) 模式来同步数据(模式在网络视图 (Network View) 组件中设置)。

不可靠的模式中,正在被同步的整个对象将在网络更新循环的每次迭代上被传输。该更新的频率是由 Network.sendRate的值确定的,默认设置为每秒 15 次更新。不可靠的模式可确保进行频繁更新,但任何丢失或延迟的数据包都将直接被忽略。在对象的状态改变频率很快,并且未成功的更新的影响十分短暂的情况下,这常常会是最佳的同步模式。但您应该记住每次更新期间可能会发送的数据量。例如,同步一次变换 (Transform) 要传输九个浮点值(三个 Vector3,每个 Vector3 有三个浮点值),相当于每次更新 36 字节。如果服务器与 8 个客户端连接运行并使用默认的更新频率,那么它将以 4,320 KBytes/s (8*36*15) 或 34.6Kbits/s 的速度接收数据并以 30.2 KBytes/s (8*7*36*15) 或 242Kbits/s 的速度传输数据。您可以通过降低更新频率来大幅缩减带宽消耗,但默认值 15 对于动作迅速的游戏来说是合适的。

可靠的差值压缩 (Reliable Delta Compressed) 模式中,可保证数据可靠地发送并以正确的顺序到达。如果数据包丢失了,其将被重新传输。如果数据包未按顺序到达,其将被缓冲直到序列中的所有数据包到达为止。虽然这能够确保传输的数据可以被正确地接收,但等待和重新传输会增加带宽的使用。但是,数据也是压缩的差值,也就是说只会传输前一个状态和当前状态之间的差值。如果状态是完全相同的,那么不会传送任何数据。因此差值压缩的优势取决于状态的改变量以及发生改变的属性。

同步的是什么数据

游戏的设计中有大量的创作机会,因此即使状态在严格意义上来讲为不同的情况下,也会在所有客户端上显示为相同。一个例子就是动画的同步。如果网络视图 (Network View) 观察到一个动画 (Animation) 组件,那么该组件的属性就会被精确同步,使得该动画的帧在所有客户端上显示得完全相同。尽管在某些情况下这不能令人满意,但通常情况下足以用于显示角色的行走、奔跑、跳跃等。因此,可以仅发送一个指示播放哪个动画序列的整数值来粗略同步动画。与同步整个动画 (Animation) 组件相比,这将会节省大量的带宽。

何时同步数据

通常无需在所有客户端上保持游戏完美同步。例如,玩家暂时在游戏世界中的不同区域,从而不会遇到彼此的情况。这可以减小服务器的带宽以及负载,因为只有能够交互的客户端才需要保持同步。此概念有时被称为相关集合 (Relevant Set)(即,整个游戏有一个子集,该子集在任意特定时间与任意特定客户端有关)。可使用 RPC 根据客户端的相关集合 (relevant set) 来处理客户端的同步,因为它们能在更大程度上控制状态更新的目的。

等级加载

加载等级时,很少需要担心正在使用的带宽,因为每个客户端都可以等待,直到所有其他客户端初始化了要播放的等级。等级加载常常涉及传输相当大的数据项(例如,图像或音频数据)。

Page last updated: 2013-06-27