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 同步游戏解决方案梳理

    2024-04-23 11:08:04       33 阅读
  2. Unity-游戏

    2024-04-23 11:08:04       62 阅读
  3. 游戏数低怎么解决

    2024-04-23 11:08:04       99 阅读
  4. 限制Unity率的方式

    2024-04-23 11:08:04       59 阅读
  5. Unity3D PVP游戏位置同步算法优化详解

    2024-04-23 11:08:04       62 阅读
  6. Unity3D PVP游戏位置同步算法优化详解

    2024-04-23 11:08:04       55 阅读
  7. Unity3D 锁与垂直同步的不同处详解

    2024-04-23 11:08:04       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-23 11:08:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-23 11:08:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-23 11:08:04       82 阅读
  4. Python语言-面向对象

    2024-04-23 11:08:04       91 阅读

热门阅读

  1. Qt Android 无法加载 assets 目录下 lua 校准脚本

    2024-04-23 11:08:04       37 阅读
  2. 火绒安全的用法

    2024-04-23 11:08:04       34 阅读
  3. 火绒安全的用法

    2024-04-23 11:08:04       32 阅读
  4. 小米消金深耕科技金融,引领金融服务创新体验

    2024-04-23 11:08:04       33 阅读
  5. 【微软押注ARM架构,“Wintel”联盟摇摇欲坠?】

    2024-04-23 11:08:04       37 阅读
  6. 迭代加深搜索

    2024-04-23 11:08:04       37 阅读
  7. 用爬虫玩转石墨文档

    2024-04-23 11:08:04       38 阅读
  8. PDD爬虫工具分享 采集拼多多商家联系方式的工具

    2024-04-23 11:08:04       28 阅读