网络游戏开发之同步模式

网络游戏开发之同步模式

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

同步模式一般分两种:状态同步和帧同步。
在这里插入图片描述

状态同步:状态发生变化后,客户端上传操作到服务器,服务器收到后处理行为的结果,然后以广播的方式把状态发送给客户端,客户端收到状态后再根据状态显示内容。
如:吃鸡等大地图游戏、MMO游戏、因为MMO游戏的客户端承载有限,并不能把整张地图的实体全部展现出来。

帧同步:每一帧都要同步,每个客户端通过拿到相同的状态和指令,按帧顺序执行,达到同步效果。
如:LOL、王者荣耀等

二者区别:
1、状态同步的战斗逻辑在服务端,而帧同步的战斗逻辑在客户端,服务端只转发操作,不做任何逻辑处理。
2、状态同步比帧同步流量消耗大,服务器压力比较大,因为要做更多运算。
3、状态同步的安全性比帧同步高很多,因为状态同步的所有逻辑和数值都是在服务端的,而帧同步因为所有数据全部在客户端,所以解析客户端的数据之后就很容易作弊。
4、状态同步开发起来比较难,一个功能至少需要一个客户端和服务端共同完成;

回放&观战
帧同步的回放&观战比状态同步好做得多,因为只需要保存每局所有人的操作就好了,而状态同步的回放&观战,需要有一个回放&观战服务器,当一局战斗打响,战斗服务器在给客户端发送消息的同时,还需要把这些消息发给放&观战服务器,回放&观战服务器做储存,如果有其他客户端请求回放或者观战,则回放&观战服务器把储存起来的消息按时间发给客户端。

断线重连
状态同步的断线重连,就是把整个场景和人物全部重新生成一遍,各种数值根据服务端提供加到角色身上。
帧同步的断线重连就比较麻烦了,服务端要把断线时间内的所有消息一次性发给客户端,然后客户端加速整个游戏的核心逻辑运行速度(timeScale),直到追上现有进度。因为计算逻辑在客户端,一旦跳过某些帧数,很容易出问题。

注意:
需要保证每次随机的数字都相同,所以需要自己实现一套随机数,不能用unity自带的那个随机数接口,而且需要服务端发送相同的随机种子;
所有float型的参数必须变成int型,因为非常微小的误差就有可能产生蝴蝶效应,保证计算结果一致。

ECS框架:Entity-Component-System
https://blog.csdn.net/zcaixzy5211314/article/details/84888743
https://blog.csdn.net/qq_41211553/article/details/108641814
ECS是一种用于处理数据关系的架构模式,用于组建并处理游戏中的数据和行为。
Entity:代表游戏中的实体,是 Component 的容器。本身并 无数据和逻辑。
Component:代表实体“有什么”,一个或多个 Component 组成了游戏中的逻辑实体。 只有数据 ,不涉及逻辑。
System:对 Component 集中进行 逻辑操作 的部分。

C# Job System:
https://www.cnblogs.com/sifenkesi/p/12258842.html
简化多线程:job system通过创建jobs来实现多线程,而不是直接创建thread。
job概念:完成特定任务的一个小的工作单元。
编写多线程代码可以提供更好的性能表现,C# Job System的一个非常关键的方面是它可以融入Unity内部的原生Job System。这使得用户的代码可以和Unity共享worker threads。这种合作避免了创建更多线程,因为这可能会造成对于CPU资源的争抢。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>