概述
一 帧同步注意事项【怎么保证确定性】
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:皮肤修改美化 对应方法:严重以后在想法子解决这个问题
最后
以上就是直率茉莉为你收集整理的开始立项时候的一些帧同步的总结的全部内容,希望文章能够帮你解决开始立项时候的一些帧同步的总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复