网络游戏如何实现所有客户端玩家信息同步?

网络游戏如何实现所有客户端玩家信息同步?

网络游戏如何同步所有客户端玩家信息? (比如吃鸡游戏所有玩家的位置是同步的)

同步方式一般分为两种:状态同步和帧同步。

状态同步:状态发生变化后,客户端将操作上传到服务器。 服务器接收后处理行为的结果,然后将状态以广播的方式发送给客户端。 客户端收到状态后,根据状态显示内容。

例如:吃鸡之类的大地图游戏,以及MMO游戏。 由于MMO游戏的客户端负载能力有限,无法显示整个地图的所有实体。

帧同步:每一帧必须同步。 每个客户端获取相同的状态和指令,并按帧顺序执行,达到同步效果。

如:LOL、王者荣耀等。

两者的区别:

1、状态同步的战斗逻辑在服务器端,帧同步的战斗逻辑在客户端。 服务器端只转发操作,不做任何逻辑处理。

2、状态同步比帧同步消耗更多的流量,服务器压力更大,因为需要更多的计算。

3、状态同步的安全性比帧同步高很多游戏动态,因为状态同步的所有逻辑和值都在服务器端,而帧同步所有数据都在客户端,所以解析客户端数据后很容易作弊。

4、开发状态同步困难。 一项功能至少需要一个客户端和服务器共同完成;

重播和观看

帧同步回放观看比状态同步容易得多,因为只需要保存每一轮所有人的操作,而状态同步回放观看则需要回放观看服务器。 当战斗开始时,战斗服务器在向客户端发送消息的同时,还需要将这些消息发送给回放查看服务器,回放查看服务器存储这些消息。 如果其他客户端请求播放或查看,播放查看服务器将存储已存储的消息。 根据时间发送给客户。

断开连接并重新连接

状态同步断线重连意味着重新生成整个场景和角色网络游戏开发3D交通工具,并根据服务器提供的内容给角色添加各种值。

断线重连时帧同步比较麻烦。 服务器需要将断线时间内的所有消息一次性发送给客户端,然后客户端加速整个游戏的核心逻辑运行速度(timeScale),直到赶上现有的进度。 由于计算逻辑在客户端,一旦跳过某些帧,就很容易出现问题。

帧同步注意事项:

确保所有客户端的计算结果一致

1. 确保客户端的显示层和逻辑层分离。

2、不能使用C#自带的随机数接口(需要通过服务器获取随机种子)。 float类型必须换成int,因为很小的错误都可能造成蝴蝶效应,并且计算结果必须一致。

ECS框架:实体-组件-系统

ECS是一种处理数据关系的架构模式,用于组织和处理游戏中的数据和行为。

Entity:代表游戏中的实体,是Component的容器。 本身没有数据或逻辑。

组件:代表实体拥有的“内容”。 一个或多个组件构成游戏中的逻辑实体。 只是数据网络游戏开发,不涉及逻辑。

System:对Component进行集中逻辑运算的部分。

C# 作业系统:

简化多线程:作业系统通过创建作业来实现多线程,而不是直接创建线程。

工作概念:完成特定任务的小工作单元。

编写多线程代码可以提供更好的性能。 C# 作业系统的一个非常关键的方面是它可以集成到 Unity 内部的本机作业系统中。 这允许用户代码与 Unity 共享工作线程。 这种协作避免了创建更多线程,这可能会导致 CPU 资源争用。

文章来源:https://blog.csdn.net/qq_43505432/article/details/121477391