Unity 帧同步游戏解决方案梳理

帧同步游戏解决方案梳理

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

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

1、逻辑与显示分离

逻辑控制显示,而显示的执行并不能影响逻辑和数据,做到脱离显示模块,游戏也能正常运行。

2、浮点的处理

浮点运算在不同操作系统算出来的结果有精度差异,所以用定点数方案。

定点数的原理就是把小数转成整数存储和计算,然后再进行转换,网上也有很多定点数的现成库。

浮点处理一般有两种办法,一种分数,一种定点数。据说王者荣耀是用分数(不确定)。定点数性能要比浮点数差。

3、随机数处理

使用伪随机代替随机数。基本功能只需要,设定一个种子,取随机只跟取出的次数有关,然后就是保证随机性。

4、替换unity自带的物理引擎和Navigation寻路

因为unity对物理引擎和Navigation寻路用到了浮点数,导致执行结果不可控,无法保证计算一致性。

如:使用第三方的定点数物理引擎代替unity物理引擎(如:BEPUphysicsint);使用支持帧同步的astar代替navigation,首先导出navmesh为mesh文件获得导航网格数据,然后用四叉树序列化网格顶点,用于查询目标的所在位置;

二、帧同步手感优化:

帧同步本身存在延迟问题,还可能遇到丢包的情况,导致游戏画面或手感存在很大的问题。

1、帧预测

在客户端超过一定的时间没收到同步帧时,那么我们就先认为这一帧啥指令也没有,空跑一帧,比如:让场上的角色继续以上一帧的速度往前走。大部分情况下,这种预测是对的。但是预测之前,要记录一些数据,以便同步帧过来后回滚这些信息。另外只需要预测跟运动相关的简单操作即可,复杂的预测没必要也不好回滚。(玩家越多,预测失败概率越高,回滚就会压力更大,好在我们这个只是1V1)

2、矫正

当加了预测又重新收到同步帧时,不要让角色瞬间回到目标位置,使用tween方法控制角色以合适的速度平滑地移动到目标位置,保证角色不会一卡一卡的,也不会一会儿快一会儿慢,从而为了提升游戏画面和手感。

3、平滑处理

为了应付网络抖动,可能缺帧或者多帧的情况,客户端以固定帧率去执行每帧的事件,让游戏更加流畅。

4、帧回滚

当客户端接收的服务器同步帧和本地的帧预测结果不一致时,客户端需要进行帧回滚,将本地的游戏数据恢复。帧回滚可以保证各个客户端的游戏状态保持一致,但是会带来一定的游戏画面延迟和卡顿。

三、不同步问题总结:

1、浮点和随机上面说了,这里不做过多叙述。

2、不确定顺序的容器的遍历要严令禁止,lua表的遍历,for pairs是必须要禁止的,可以使用for ipairs。C++的Map等,总之在使用容器的遍历时,一定要查阅是否是确定顺序的。

3、代码不要出现"我"这样的逻辑,对于不同客户端和服务器"我"是不同的,但是据我观察,这个是避免不了的,特别对于界面显示来讲,所在在使用"我"的时候一定要注意,不要影响战斗逻辑。

4、原则上除了Input是不让C#调用lua代码的,但是也是不可避免有些显示相关的需要回调到lua,这里也千万不要改变战斗逻辑,建议从C#回调lua的战斗代码统一写到一个地方,方便查阅和检查。

5、不同平台的long型是不一样的,long这个类型最好是不要使用,要么用int,要么用longlong。

四、帧同步优化:

AOI算法:一般用于MMO大地图游戏,每个物体都有自己的AOI(区域划分),只对一定半径范围内发生的事件进行处理,区域注释。

相关推荐
新的瑞拉公主1 小时前
Unity游戏发布微信小游戏:从构建到提审
unity·webgl·微信小游戏·开放数据域
Jae den13 小时前
网络延迟为什么会影响游戏和实时业务?
网络·游戏
思盛iOS签名上架16 小时前
ipa企业签名闪退是什么原因?
游戏·ios·testfight
狂人开飞机18 小时前
14、游戏手感与视觉打磨
游戏·游戏引擎·godot
狂人开飞机1 天前
15、音频系统
游戏引擎·godot
狂人开飞机1 天前
16、粒子线条与视觉特效
游戏引擎·godot
心前阳光1 天前
Unity发布PC软件图标不能改变
unity·游戏引擎
笨鸟先飞的橘猫2 天前
系统设计第十七天决策卡
学习·游戏
一孤程2 天前
游戏测试专题第二篇:游戏功能测试与用例设计实战
功能测试·游戏·测试·测试覆盖率
科技泡泡堂2 天前
想玩《黎明行者之血》?2026年这4款适合玩3A的游戏本值得一看
游戏