Post

网络同步之状态同步--MMO服务器开发技术点记录

网络同步之状态同步--MMO服务器开发技术点记录

状态同步

网络同步是服务器开放老生常谈的技术点,也是MMO游戏中至关重要的一环。它确保了所有玩家在同一场景中的状态一致性,使得玩家之间的交互能够实时反映在游戏世界中。网络同步方案大致分为两类:帧同步和状态同步。关于帧同步,可以参考这篇博客帧同步

本篇主要讲解在我们的MMO服务器中,状态同步是如何实现的。

在ECS架构篇中,我们讲到游戏系统由多个实体组成,实体内由多个组件组成。不同玩家实体和环境实体的信息被某一个玩家修改时,会导致自身实体状态或者组件状态的变化,这些变化需要通过网络同步到其他玩家,这个同步就称为状态同步。大致流程如下:

1
client A 提供输入 -> 服务器处理输入 -> client A entity 状态变化 -> 服务器广播状态变化 -> 其他玩家接收状态变化

如果玩家的任何输入都带来全量状态同步,在玩家数较大时,会导致服务器IO压力过大,影响游戏性能。我们将在MMO服务器中使用的优化方案是增量的状态同步;实体拥有多个组件,输入如果只影响了某个组件的状态变化,那么只需要将这个组件的状态变化同步到其他玩家,而不是整个实体的状态。这种方式可以大大减少网络带宽的消耗,提高游戏性能。

那么如何进行状态的同步呢,我们知道服务端和客户端之间的通信是字节流的传输。所以在服务端我们需要让实体和组件具备序列化的能力,在客户端我们需要具备反序列化实体和组件的能力。

组件的结构比较复杂,其序列化和反序列化可以依靠工具,我们的MMO服务器使用protobuf作为序列化的工具。

sync_full_info / 全量更新

全量更新状态,通常在玩家加入场景时触发,第一次加入或者断线重连后触发。会将玩家实体和所有组件序列化后写入字节流,发送给全部客户端(包括自己)。

This post is licensed under CC BY 4.0 by the author.