Unity网络同步方案帧同步和状态同步

网络同步方案

  • 介绍
    • 开始我们使用的状态同步(实时状态同步)
    • 后来采用的帧同步
  • 状态同步
    • 优点
    • 缺点
  • 帧同步
    • 顺序执行
    • 追帧
    • 重连
    • 优点
    • 缺点
  • 总结

这两年做的都是帧同步和状态同步的项目,正好最近有时间总结一下什么是帧同步和状态同步,之前在做第一个足球项目的时候开会讨论了也很久开始选择的方向有点问题选的状态同步,没有选择帧同步,正好说一下来帮大家避坑

介绍

刚开始我们团队立项的休闲足球游戏,很多人应该都玩过之前的CoolGoal! - Soccer这个游戏,根据手势划线来想办法进球的一个游戏,有点像点球达人(去掉联网的部分)这样一款游戏,后来在老板的兴趣爱好下逐步扩大到多人足球模式,1v1、2v2、3v3、4v4、5v5、6v6等多人匹配模式。后面才有了我们选状态同步和帧同步方案。

开始我们使用的状态同步(实时状态同步)

设想的是每个客户端同步发送自己操作对象的位置和旋转以及一些动作和状态等,其他客户端和自己接收每个人的位置在本地做平滑补针处理。至于足球的信息同步是谁带球谁去做同步,不带球时则上一个带球人同步足球信息。这种做法在理想的情况下是没有问题的,比较丝滑。但是如果在网络信号稍微差一点的情况下,或者同步球位置的人网络差,那么这场一个人会影响所有人的体验,显然不合理。但是好处是验证比赛结果确实很好做,甚至可以不用做,比赛时就在验证。而且客户端的压力也不是很大。

后来采用的帧同步

帧同步的坑其实更多,如果你是想本地搭建一个健全的定点数物理库以及碰撞那么这个周期会非常长;

  1. 持续的优化和有足够的底层基础这个是你想自己搭建物理库的基础;
  2. 如果你们要做AI的话,你市面上的AI插件你必然是没法使用的,因为都是浮点数,需要自己在实现一套定点数的AI行为树;
  3. 如果你们项目需要做寻路,那么当然你也需要实现一套定点数的寻路系统;
  4. 抛开显示层可以使用浮点数做插值运算平滑补帧处理之外,逻辑层都不能用Unity先关的浮点数组件,包括缸体碰撞等所有的浮点数组件,你必须写一套浮点数的;当然现在有GPT你可以觉得简单,但是这件事情你如果没有搞过引擎底层的话还是慎重考虑,因为你考虑的东西应该没有底层玩家考虑的周全,持续优化点应该也会比较多;
  5. 后面我会推荐一下做帧同步和状态同步的平台和我们用的健全的物理库;

状态同步

状态同步说白了就是把玩家的当前的状态行为做为一个同步的帧去做同步,通常情况下AI、技能、Buf、战斗逻辑计算都是由服务器运算,把运算的结果同步给客户端,客户端在根据收到的帧状态本子做平滑补帧更新自己的状态(动作、Buff、位置等)就好。服务器的压力会比帧同步压力大很多,客户端可以做一些本地计算来减轻服务器的压力和同步数据量。

优点

  1. 比较安全,因为逻辑在服务器上的原因,防作弊机制天然就有了;
  2. 状态同步对网络带宽和抖动包比较友好,延迟很高在恢复,对玩家的体验影响会小一些;
  3. 断线重连机制相对好做一些,因为只需要同步当前所有对象的最新状态即可;
  4. 逻辑方便优化,客户端当前屏幕中看不到的玩家都可以裁剪屏蔽,减少运算量;

缺点

  1. 对比帧同步开发效率比较低,保证服务器和客户端每一个角色对象状态之间的一致比较难。比如优化一些裁剪,网络抖动等,你想让每一个角色对象状态同步还是没那么简单,这块也是需要些时间来做。
  2. 打击感相对差一些,因为状态同步的计算伤害都是服务器来计算,你客户端制作同步,如果射击类或者打击感比较强的游戏想要比较精准还是很困难,系统需要在很短的时间内产生很多子弹和数据,需要的开销也不小;
  3. 你的游戏越复杂你要同步的状态信息也会变大,可能一局游戏需要的数据流量会很大。

帧同步

简单来说帧同步就是 相同的状态 + 相同的指令 + 按帧顺序执行 + 相同物理库 = 相同的结果。逻辑层显示层分离,客户端使用一致的物理库和定点数,接收一样的随机种子确保逻辑一致。服务器只转发所有客户端发来的指令,客户端本地运算。

顺序执行

每帧都要有序号,需要保证所有的帧都跑一边且不能中途丢帧,如果丢帧则计算的结果肯定会不一致。

追帧

当客户端在网络上信号差或者网络波动的,接收到服务器下发多个帧,客户端就需要所加速播放帧。这里是一个追帧机制,优化可以不播放音效和特效,不影响结果的显示层逻辑都可以不处理。

重连

重连时需要拿到完整的比赛帧数据,从开始一直加速播放到当前帧(追帧机制)。

优点

  1. 帧同步开发效率比较高。服务器逻辑简单只需要负责转发指令压力小,客户端封装好物理组件和碰撞等直接上手写即可。
  2. 它能实现更强的打击感,打击感强除了我们说的各种反馈、特效、音效外,还有它的准确性。利用帧同步,游戏里面看到这些挥舞的动作,就能做到在比较准确的时刻产生反馈,以及动作本身的密度也可以做到很高的频率,这在状态同步下是比较难做的
  3. 它的流量消耗是稳定的。大家应该看过《星级争霸》的录像,它只有几百K的大小,这里面只有驱动游戏的输入序列。帧同步只会随着玩家数量的增多,流量才会增长,如果玩家数量固定的话,不管你的游戏有多复杂,你的角色有多少,流量消耗基本上都是稳定的。
  4. 可以更方便地实现观战,录像的存储、回放,以及基于录像文件的后续处理。

缺点

  1. 最致命的缺点是网络要求比较高,帧同步是锁帧的,如果有网络的抖动,一段时间调用次数不稳定,网络命令的延迟就会挤压,引起卡顿。
  2. 它的反外挂能力很弱,帧同步的逻辑都在客户端里面,你可以比较容易的修改它。但为什么《王者荣耀》敢用帧同步,一方面是因为当时立项的时候开发周期很短,半年时间要做上线,要有几十个英雄,存在时间的压力,另一方面,MOBA类游戏不像数值成长类的游戏,它的玩法是基于单局的,单局的作弊修改,顶多影响这一局的胜负,不会存档,不会出现刷多少钱刷多少好的装备的问题,而且作弊之后我们也很容易监测到,并给予应有的惩罚,所以我们认为这不是致命的缺点。
  3. 它的断线重回时间很长,相信台下也有很多王者玩家,也曾碰到过闪退以后重回加载非常长的情况,甚至加载完以后游戏也快结束了,这是帧同步比较致命的问题。
  4. 它的逻辑性能优化有很大的压力。大家应该没有见到哪一款大型游戏是用帧同步来做的,因为这些游戏的每一个逻辑对象都是需要在客户端进行运算的。如果你做一个主城,主城里面有上千人,上千人虽然玩家看不到它,但游戏仍然需要对他们进行有效的逻辑运算,所以帧同步无法做非常多的对象都需要更新的游戏场景。
  5. debug困难,出现不同的情况,难以查找问题所在,一般通过debug输出关键改变信息来定位问题,但问题可能在1-20个函数之内,但只在第20个函数打了debug信息,然后需要一层层去查找出现问题的所在,考虑把出问题的局录下来,然后不断重播和调试,方便找到问题

总结

希望我的经历和理解能够帮助到大家,其中部分是借用别人的博客内容,感谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/239827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内核地址消毒剂(KASAN)

概述 Kernel Address SANitizer(KASAN)是一种动态内存安全错误检测工具,主要功能是 检查内存越界访问和使用已释放内存的问题。 KASAN有三种模式: 通用KASAN 基于软件标签的KASAN 基于硬件标签的KASAN 用CONFIG_KASAN_GENERIC启用的通用KASAN,是用于调试的模式,类似于用户…

SolidKits.BOMs工具—BOM及焊件切割清单输出

SolidKits.BOMs工具—BOM及焊件切割清单输出包含自动出BOM,自定义模板,焊件切割清单的输出,虚拟件的输出等功能,使用该功能,无需打开SOLIDWORKS软件,可大大提高工作效率。为回馈新老客户,此工具…

Ubuntu 常用命令之 exit 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 exit命令在Ubuntu系统下用于结束一个终端会话。它可以用于退出当前的shell,结束当前的脚本执行,或者结束一个ssh会话。 exit命令的参数是一个可选的整数,用于指定退出状态。如果没有指定&#…

基于ip地址通过openssl生成自签名证书

最近在配置geo的时候,客户说自己使用的是自签证书,然后是通过ip地址和端口的方式访问gitlab,比较好奇这块,因此对证书的生成和使用做了一些整理,对此网上关于这部分资料也很多,不过作为记录,也算…

美国的目的暴露了,夺下6台EUV光刻机推进2纳米,反超台积电

日前消息指光刻机巨头ASML预计明年量产10台第二代EUV光刻机,其中6台已确定被美国芯片企业Intel夺下,剩下的两台将由三星和台积电竞争,如此一来拿到更多第二代EUV光刻机的美国可望率先量产2纳米,反超台积电。 一、第二代EUV光刻机的…

Pytorch项目,肺癌检测项目之二

diameter_dict{} with open(/xunlian/annotations.csv ,‘r’) as f: for row in list(csv.reader(f)[1:]): series_uid row[0] annotationCenter_xyz tuple([float(x) for x in row[1:4]]) annotationDiameter_mm float(row[4]) diameter_dict.setdefault(seri…

Qt中字符串转换为JS的函数执行

简介 在 QML 中,将 JavaScript 字符串转换为函数通常涉及使用 Function 构造函数或 eval() 函数。但是,QML 的环境对 JavaScript 的支持有一定的限制,因此不是所有的 JavaScript 功能都可以在 QML 中直接使用。 以下介绍都是在Qt5.12.1…

Spring简介

一:Spring是什么 Spring是分层的Java SE/EE应用full-stack(各层都有对应解决方案)轻量级(api较少,学习成本较低)开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp…

最新Unity DOTS Physics物理引擎碰撞事件处理

最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎,今天我们给大家分享和介绍一下这个物理引擎的碰撞事件处理以及核心相关概念。 Unity.Physics物理引擎的主要流程与Pipeline Unity.Physics物理引擎做仿真迭代计算的时候主要通过以下步骤来…

基于SpringBoot简洁优雅的个人博客系统

源代码下载地址: 点击这里下载 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或…

java八股jvm

JVM虚拟机篇-01-JVM介绍、运行流程_哔哩哔哩_bilibili 1.PC程序计数器 2.堆 3.虚拟机栈 4.方法区/永久代/元空间 5.直接内存 JVM虚拟机篇-06-JVM组成-你听过直接内存吗_哔哩哔哩_bilibili 6.双亲委派 从下往上找,有同名类优先使用上级加载器的,不用自…

【SpringBoot篇】基于Redis实现生成全局唯一ID的方法

文章目录 🍔生成全局唯一ID🌹为什么要生成全局唯一id🌺生成全局id的方法✨代码实现 🍔生成全局唯一ID 是一种在分布式系统下用来生成全局唯一id的工具 在项目中生成全局唯一ID有很多好处,其中包括: 数据…

***linux 配置服务开机自启动

目录 一、如何让一个服务或脚本开机自启动? 1. 三种解决方案 2. systemd 和 chkconfig 二、chkconfig 1. chkconfig 管理服务脚本要求 2. chkconfig命令 三、Linux 运行级别 四、参考 linux 配置服务开机自启动(systemd 和 chkconfig --add 设置…

sql-labs服务器结构

双层服务器结构 一个是tomcat的jsp服务器,一个是apache的php服务器,提供服务的是php服务器,只是tomcat向php服务器请求数据,php服务器返回数据给tomcat。 此处的29-32关都是这个结构,不是用docker拉取的镜像要搭建一下…

【Python】异常、模块与包

一、异常的概念 二、异常的捕获方法 三、异常的传递 四、Python模块 五、Python包 六、安装第三方Python包 一、异常的概念 什么是异常: 异常就是程序运行的过程中出现了错误bug是什么意思: bug就是指异常的意思,因为历史因为小虫子导致计算…

java.lang.NullPointerException出现的原因及解决方案

java.lang.NullPointerException出现的原因及解决方案 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在编程的世界里,我们常常遇到NullPointerExceptio…

ansible-playbook的Temlates模块 tags模块 Roles模块

Temlates模块 jinja模板架构,通过模板可以实现向模板文件传参(python转义)把占位符参数传到配置文件中去,生产一个目标文本文件,传递变量到需要的配置文件当中 (web开发) nginx.conf.j2 早文件当中配置的是占位符(声明…

Error in `arrange()`: ! Can‘t transform a data frame with `NA` or `““` names.

问题:给Taxonomy排序,并筛选OTU表中存在的 根据提示运行:rlang::last_error(),显示: Backtrace:▆1. ├─dplyr::arrange(taxonomy, phylum, class, order, family, full)2. ├─dplyr:::arrange.data.frame(taxonom…

【SpringBoot篇】解决缓存击穿问题① — 基于互斥锁方式

文章目录 🌹什么是缓存击穿🌺基于互斥锁解决问题🛸思路 🏳️‍🌈代码实现 🌹什么是缓存击穿 缓存击穿是指在使用缓存系统时,对一个热点数据的高并发请求导致缓存失效,多个请求同时访…

云渲染怎么批量效果图、影视动画?云渲染在效果图、影视的作用

在设计和建筑领域,设计师往往需要制作出精细逼真的效果图以向客户展示他们的设计思路。然而,在这些行业中,大量生成效果图需求非常费时费力。幸运的是,日期到了云渲染的这个时代,设计师们可以通过云渲染服务以一种更加…