开始立项时候的一些帧同步的总结
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:皮肤修改美化 对应方法:严重以后在想法子解决这个问题
以上是关于开始立项时候的一些帧同步的总结的主要内容,如果未能解决你的问题,请参考以下文章