开始立项时候的一些帧同步的总结

Posted 青蛙~~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开始立项时候的一些帧同步的总结相关的知识,希望对你有一定的参考价值。

一 帧同步注意事项【怎么保证确定性】

1:float问题

   主要是和平台iee754 和iee854平台不同,还有运算精度问题,建议使用定点数来解决这个问题

2:多线程问题

主要是每个客服端多线程算出结果可能会不一致,比如A客服端用了3个线程来算你 这个数据,b客服端用1个线程来算你这个数据导致最后A和B的结果不一致,除非你 能保证最后结果一致,要不最好别用

3:执行顺序问题  >>>>>>>> 注意容器的排序不确定性,lua table访问顺序最好用ipair 来保证顺序因为ipair是数组下标访问方式 ,pair是遍历键值对不能保证顺顺序

4:vector 浮点数问题

5:物理碰撞问题

6:随机数问题

7:对时(用NTP技术对时)

8:未初始化变量

9:使用了本地数据,因为本地变量等等数据不一样导致算出的结果不一致

 

二 帧同步预测,快照 回滚

预测:采用的是客服端先行策略,来保证客服端操作的流畅,客服端更具相关的逻辑算出下一帧玩家会做什么操作

快照:利用ecs框架进行代码隔离,所有的数据存在了component 组件当中,以便快速的形成快照,发给客服端进行回滚操作,或者进行

 

逻辑和显示的分离

比如在技能方面应该客服端的骨骼动画,不应该和逻辑层困在一起,举个例子

比如现在在第一帧的时候玩家进行了挥刀操作,这个时候就应该进行数学逻辑上的物理碰撞检测,而不和客服端的骨骼动画的动画时间(播放一个动作需要的时间)进行捆绑

帧同步网络协议的实现

1:可靠udp

2: 冗余udp

3:tcp + fec(这个可以参考韦易笑的博客)

https://github.com/skywind3000/kcp/wiki/Network-Layer

https://github.com/skywind3000/kcp/wiki/KCP-Best-Practice

 

5 ECS架构

 主要用来进行数据的分离,好产生每一帧所需要的快照 快照就是当前这一帧玩家的数据(位置,血量,等等)操作指令

E:Entity 实体  游戏内部基本单元

C:Component 组件 存储的数据,只能存储数据,注意不能在里面写逻辑运算

S:System 系统 对数据进行逻辑处理的地方

 

6:流畅性

1:运动补间

2:tcp ,udp

3:jitterBuffer

 

7:外挂

1:修改属性  对应方法:可以把你的属性值算出一个hash值放服务器上面去校验,别人的hash值也上传做一个仲裁校验知道谁作弊了,还可以对你的数值进行加密,比如int类型的加密,让找不到这个数据在哪里

2:透视 :对应方法:可以把这个关键的数据是不是显示moba迷雾这个bool值上传到服务器,这个值很小也不会对网络流量造成多大影响

3:自动操作 对应方法:没有太好的法子,基本靠玩家投票解决

4:皮肤修改美化 对应方法:严重以后在想法子解决这个问题

 

 

 

以上是关于开始立项时候的一些帧同步的总结的主要内容,如果未能解决你的问题,请参考以下文章

网络同步方式——帧同步与状态同步

网络同步方式——帧同步与状态同步

Unity帧同步的实现方法

LTE同步技术

帧同步坦克大战移动系统

解决ffmpeg中的时间戳同步问题_day95