《网络多人游戏架构与编程》之序列化、RPC、网络拓扑

/////////////////////////////////////       对 象 序 列 化      //////////////////////////////////////////////////
 
Q.什么是序列化?
序列化 是一种将 对象 从 内存中 的 随机访问格式 转换为 比特流格式 的 行为。这些比特流可以在硬盘上存储,也可以通过网络传输,之后再恢复成原始格式。
 
Q.什么是流?
流stream 是一种数据结构,封装了一组有序的数据元素,并允许用户对其进行读写。流可以是输出流(允许顺序插入但不许读取)、输入流(允许顺序提取但不许插入),或者输入输出流。
 
Q.什么是字节序?不同平台怎么保证字节序?
字节序 是 字节 在一个平台上的 存储顺序。有小端字节序(低位编址) 和 大端字节序(高位编址)。可以通过字节交换算法或内部函数和汇编指令。
 
Q.怎么压缩数据?
  1. 去除任何不需要通过网络发送的数据,例如稀疏的不被完全填充的数据结构。
  2. 熵编码:比如用bool值同义表达int值。
  3. 定点:所有可能取值总数=(最大值-最小值)/精度+1  , 需要log2(所有可能取值总数)位。
  4. 几何压缩:四元数只传3个分量,剩下那个可以用1-其他分量得到。

 

/////////////////////////////////////////////       对 象 复  制     ////////////////////////////////////////////////

 
作用:支持远程进程之间游戏世界和对象状态的同步。
 
复制:从一台主机向另一台主机传输对象状态的行为。
 
复制预处理
  1. 标记数据包为包含对象状态的数据包;
    • 创建1个枚举类型,来标识每个数据包的类型。
    • 接收方从数据包中读取数据包类型,然后决定如何处理。
    • 习惯上,主机之间交换的第一个数据包被标记为"hello"数据包,用于建立连接、分配状态。
  2. 唯一标识复制对象;
    • 接收方根据标识,确认是否有这个传入对象的副本。有,直接更新;没有,实例化一个对象。
  3. 指明被复制对象的类型。
 
世界状态增量:发送方创建表示世界状态变化的数据包,然后接收方在自己的世界状态中更新这些变化。每个数据包都包含世界状态增量。
对象状态增量:世界状态增量包含需要改变的每个对象的对象状态增量(创建、更新、销毁游戏对象)。
 
局部对象状态的复制:枚举值可以通过按位或运算组合在一起表示多个属性。
 
远程过程调用 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实现。
posted @ 2022-05-27 11:12  番茄玛丽  阅读(255)  评论(0)    收藏  举报