《网络多人游戏架构与编程》之序列化、RPC、网络拓扑
///////////////////////////////////// 对 象 序 列 化 //////////////////////////////////////////////////
Q.什么是序列化?
序列化 是一种将 对象 从 内存中 的 随机访问格式 转换为 比特流格式 的 行为。这些比特流可以在硬盘上存储,也可以通过网络传输,之后再恢复成原始格式。
Q.什么是流?
流stream 是一种数据结构,封装了一组有序的数据元素,并允许用户对其进行读写。流可以是输出流(允许顺序插入但不许读取)、输入流(允许顺序提取但不许插入),或者输入输出流。
Q.什么是字节序?不同平台怎么保证字节序?
字节序 是 字节 在一个平台上的 存储顺序。有小端字节序(低位编址) 和 大端字节序(高位编址)。可以通过字节交换算法或内部函数和汇编指令。
Q.怎么压缩数据?
-
去除任何不需要通过网络发送的数据,例如稀疏的不被完全填充的数据结构。
-
熵编码:比如用bool值同义表达int值。
-
定点:所有可能取值总数=(最大值-最小值)/精度+1 , 需要log2(所有可能取值总数)位。
-
几何压缩:四元数只传3个分量,剩下那个可以用1-其他分量得到。
///////////////////////////////////////////// 对 象 复 制 ////////////////////////////////////////////////
作用:支持远程进程之间游戏世界和对象状态的同步。
复制:从一台主机向另一台主机传输对象状态的行为。
复制预处理:
-
标记数据包为包含对象状态的数据包;
-
创建1个枚举类型,来标识每个数据包的类型。
-
![]()
-
接收方从数据包中读取数据包类型,然后决定如何处理。
-
习惯上,主机之间交换的第一个数据包被标记为"hello"数据包,用于建立连接、分配状态。
-
唯一标识复制对象;
-
接收方根据标识,确认是否有这个传入对象的副本。有,直接更新;没有,实例化一个对象。
-
指明被复制对象的类型。
世界状态增量:发送方创建表示世界状态变化的数据包,然后接收方在自己的世界状态中更新这些变化。每个数据包都包含世界状态增量。
对象状态增量:世界状态增量包含需要改变的每个对象的对象状态增量(创建、更新、销毁游戏对象)。
局部对象状态的复制:枚举值可以通过按位或运算组合在一起表示多个属性。
远程过程调用 RPC:一台主机可以在另一台或多台远程主机上执行程序的动作。每个调用都可以被认为是 一个唯一的对象,每个参数对应一个成员变量。
远程方法调用 RMI:主机在一个特定对象上调用一个方法。
————————————————————————
总结:
-
应用层协议必须定义所有可能的数据包类型。
-
每个对象需要一个唯一的标识符。
-
对象的类需要一个唯一的标识符,这样接收不存在该对象时可以创建该对象。
-
网络代码不依赖游戏类,所以使用间接映射来向网络模块注册类和创建函数。
-
大规模的游戏无法将所有对象的复制装入一个数据包,所以使用一个协议来支持世界状态增量的传输。
-
为了提高效率,更新对象动作所发送的序列化数据可以是对象属性的子集。
-
除了复制对象状态数据,有时还需要触发远程过程调用。
///////////////////////////////////////////// 网 络 拓 扑 ////////////////////////////////////////////////
作用:决定了参与游戏的主机是如何组织在一起的。
目标:保证所有玩家都可以看到游戏状态的最新版本。
/////////////////// 客户端-服务器 C/S 结构 ///////////////////////
复杂度:n个客户端,就有O(n2)个连接。
服务器带宽:上行带宽(发送):b*n/s ,n个客户端每秒发送b字节数据。
下行带宽(接收):c*n/s,服务器每秒发送c字节给n个客户端。
客户端带宽:上行带宽(发送):b个字节的上传流。
下行带宽(接收):c个字节的下载流。
缺点:客户端数量增加,服务器的带宽要求线性增加,客户端需要复制的世界对象数目增加,每个客户端带宽略有增加。
权威服务器:以服务器为准,避免客户端欺骗。不过客户端会有一点延迟。
往返时间 RTT:数据包从发送端到目标端,再从目标端到发送端的总时长。是影响权威服务器下,客户端延迟的主要原因。理想值是100ms以下。
缺点:客户端B接收时间是A的RTT的1/2+服务器处理时间+B的RTT的1/2。
专用服务器:
- 只运行游戏状态并与所有客户端通信。
- 专用服务器的进程与客户端进程是完全分开的。
- 无外设,不显示任何图像。
- 允许在一台高性能计算机上运行多个专用服务器。
监听服务器:
- 端可以即作为客户端也作为服务端。
- 优点:降低部署成本,不需要租用服务器。
- 缺点:端的性能必须足够高,需要足够快的网络连接以应付服务器的额外负载;玩家恶意退出或网络不佳,都非常影响游戏进行。
- 监听服务器不等于对等网络连接,应该是对等托管,有服务器,但是由玩家托管。
进阶版:主机迁移:监听服务器断开,客户端中的一个被晋升为新的服务器。
对等网络:端和端之间互相连接。每个端都有n-1个连接,总复杂度O(n2)。
输入共享模型:每个端共享所有动作,模拟动作的执行。
缺点:最坏情况下,端之间的延迟是RTT的1/2。很难确保所有对等体保持同步。
改进:确定性锁步。同步伪随机数生成器。P187
————————————————————————
循环冗余检验 CRC:生成一个32位的检验和值。开源库zlib的函数crc32实现。


浙公网安备 33010602011771号