unity 网络同步 预表现(预测同步)

news2024/11/15 9:19:00

基于守望先锋ECS网络同步:

程序丨暴雪Tim Ford:《守望先锋》架构设计与网络同步

本文主要聊聊预测同步

首先FPS这类游戏东西肯定不会让服务器过分相信客户端,因为总有混蛋开挂,作为一款即使对战游戏,高性能的网络表现一定是重中之重。

案例:

cf的外挂原理就是修改了客户端的数据,接着将修改完的数据上传到服务器,服务器验证不了是否合理过分相信客户端,后来腾讯反外挂检测外界是否修改内存这才将外挂进行了拦截。

前段时间大火的“🐏了个🐏”能出现外挂也是修改了本地

所以不能过于相信客户端,但玩家操作都在客户端上,想摆脱也是不可能的。

但作为一款快速响应(responsive)的网络对战动作游戏,如果每个操作都要等服务器回包的话,就不可能有高响应性了,所以就必须针对玩家的操作做预测(predict,也可以说是预表现)。

fps也就只能:

客户端先发包给出操作,

服务器再返回给出状态。

那如果出现错误咋办?

虽然服务器会纠正这一错误,但作为一款快速反应的系统,不可能通过延迟操作来进行实现。

守望先锋采取了一个叫:”确定性”(Determinism)来减少预测错误发生的概率。

也就是说所有数据都是真实有效的,不存在服务器预判你的操作,产生假数据出现的这一现象。

确定性(Determinism)

依据时间同步技术,先同步服务器和客户端的时间,然后将帧数固定(固定更新周期和量化),包括双方发消息的时间等等,官方叫:“命令帧”,每个命令帧都是固定的16毫秒,不过在电竞比赛时是7毫秒。

比如他们把玩家操作没有放在Update中,放在更加稳定的UpdateFixed,它会在每个固定的命令帧调用。(来张官方的图:侵删)

 双方都会按照一定的频率发送消息,进行交互,差不多是这个概念

 按照这个流程,双方差不多是互相稳定的在互相发消息,当然从客户端发到收这一过程自然越短越好,但这肯定不现实,碍于延迟、程序相应等因素,这一过程肯定不会能达到想要的那种程度。

他们这个演讲提到一个叫Rtt东西,大致是这样的

RTT=ping+逻辑处理时间

一个RTT大概就是从客户端到服务器再返回到客户端的时间(扣除服务器处理时间)

官方为了计算一个提前量,给每帧加了一毫秒的提前量,作为客户端的处理时间

提前量=(RTT/2)+1(这里的1是1帧,守望的资料给的是16毫秒)

然后客户端开始模拟并把输入的操作上报给服务器,过一段时间(基本上是半个RTT加上缓冲时间)以后,服务器才开始模拟这一帧。

正因为客户端是不停地接受玩家输入,为了尽可能地贴近现在时刻,如果还需要等待服务器回包才能响应的话,那看起来就太慢了,会让游戏变得卡顿

而另外的RTT就是服务器模拟权威带来的副作用,就此客户端要用一个环形缓冲(ring buffer)来记录历史运动轨迹,目的用来处理客户端与服务器之间的错误

如果想简单的处理错误,那就直接用服务器下发的结果覆盖客户端就行了,但是这个结果已经是“旧”(相对于当前时刻的输入来讲)的了,因为服务器的回包一般都是几百毫秒之前的了。

那么接下来就是技术点了?

守望自己用的肯定不是这么简单的方案,当然对于一般游戏来说这基本上够用了

(1)守望采取了关键帧技术方案,具体是这样实现的(官图真好,接着上官图)

 我最开始并不关心服务是怎样的,我(客户端)只管操作并给服务器发我的状态,直到服务器给我返回我该有的状态,然后立刻以服务器的为准同步我的状态,而且重新计算之后所有的输入操作,直至追上当前时刻这样就又回到“帧同步”状态了

在这个过程中我们也能够获知我们这种异常状态到底进行了多久

当异常状态解除时,客户端做出反应,与此同时服务器也解除了异常状态,这样就又同步了。如上面官方示意图那样,此时客户端解除了异常状态,服务器发包虽然还是异常,但此时已经开始模拟正常状态了。由此图可见客户端要领先于服务器半个RTT,此时服务器与客户端完全同步。

(2)改装(组装)的UDP

大厂几乎都有这个习惯,就是组装upd。得益于udp特性速度快的特点备受游戏开发人员的青睐,至于安全,一个游戏管他呢也不是啥重要数据传输,只要少丢点包就好了,但天总不会随人愿。

要使用上面的的这个方案有个前提就是稳定的发包收包,可丢了就会破坏这个稳定性,服务器又试图保持了一个小小的、保存未模拟输入的缓冲区,如官方这几个图那样格子中客户端发出来的在格子中会有一点间隙,这就是缓冲区。

一旦这个缓冲区是空的,服务器只能根据你最后一次输入去“猜测”。等到真正的输入到达时,它会试着“缓和”,确保不会弄丢你的任何操作,但是也会有预测错误。

就像上图那样,服务器意识到以后,就会复制先前的输入操作来就行预测,一边祈祷希望预测正确,一边发包告诉客户端:“嘿哥们,丢包了,不太对劲哦”。接下来发生的就更奇怪的了,客户端会进行时间膨胀,比约定的帧率更快地进行模拟。

客户端这时候就会比之前更快的发包,以覆盖从客户端到服务器之间发生的丢包,让服务器能够度过丢包,服务器不再复制状态,以完成同步。

(不得不说这方案真NB,客户端主,服务器从的关系)

一旦客户端赶上来了,就不会再复制输入了,这样会有因为丢包而被忽略的风险。

客户端和服务端各自运行物理引擎,客户端不等待服务器数据而是一路向前运行,这种方案消耗较大且工程量不小

这一预测失败也会产生很多问题,这可以去上面的那个链接看去。

许多情况可能会导致出现问题,服务器或者是客户端双方的错误判定导致的许许多多的问题。

如果出现了这种问题也就只能见招拆招了。

倒是还有一些其他的方案:(指路)

浅谈物理引擎的网络同步方案 - 知乎 (zhihu.com)

对于反外挂在客户端方面腾讯倒是做的相当优秀,直接干到内存感知内存。

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

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

相关文章

ICMP与DHCP(包含DHCP的全局配置模式与接口配置模式)

目录 ICMP DHCP DHCP服务器端部署 左边的全局配置模式 右边的接口配置模式 ICMP ICMP:互联网消息控制协议,用来在网络设备间传递各种差错和控制信息,对于收集各种网络信息、诊断和排除各种网络故障等方面起着至关重要的作用。基于IP协议…

双线性插值法

文章目录前言一、双线性插值二、代码实现总结前言 在上一文《最近邻插值法》中我们讨论了最近邻,并且使用python实现,本章节中我们继续讨论图像缩放算法——双线性插值法,给难度升个级。 一、双线性插值 你在哪里见过下面这个图?回…

java基础—JDK基础面试题一

文章目录1.和equals区别是什么&#xff1f;2.Java中的 <<、>>、>>> 是什么3.if-else-if-else与switch的区别4.while和do-while的区别5.switch 是否能作用在 byte 上&#xff0c;是否能作用在 long 上&#xff0c;是否能作用在String上6.&和&&…

Mysql大数据表处理方案

场景&#xff1a; 当我们业务数据库表中的数据越来越多&#xff0c;如果你也和我遇到了以下类似场景&#xff0c;那让我们一起来解决这个问题 数据的插入,查询时长较长后续业务需求的扩展 在表中新增字段 影响较大表中的数据并不是所有的都为有效数据 需求只查询时间区间内的…

DynaSLAM-10 DynaSLAM中双目运行流程(Ⅳ):DynaSLAM的三大线程解析

目录 1.双目初始化部分 2.三种追踪模式 1.双目初始化部分 进入追踪线程首先判断双目追踪器状态mstate&#xff0c;在刚进入SLAM系统时&#xff0c; Tracking::Tracking函数默认将其设置为NO_IMAGES_YET&#xff0c;系统经过reset时也会将mstate设置为NO_IMAGES_YET......如果是…

【工业视觉-CCD相机和CMOS相机成像的本质区别】

工业视觉-CCD相机和CMOS相机成像的本质区别1.CCD的功耗高&#xff0c;CMOS的功耗低2.CCD速度较CMOS慢3.CCD的画质优于CMOS4.CCD的高感画质低于CMOS在学习工业视觉的起初&#xff0c;一般都是先去了解光源、镜头、相机等概念&#xff0c;在接触工业相机时看到两个概念&#xff0…

Java集合框架

Java集合框架 每博一文案 《杀死一只知更鸟》中有这样一段话&#xff1a;“你永远不可能真正地了解一个人&#xff0c;除非你穿上他的鞋子走来走去&#xff0c;站在他的角度思考问题。 可真当你走过他的路时&#xff0c;你连路过都觉得难过。” 世上没有真正的感同身受&#x…

数据结构 第六章 二叉树与树(树和森林)

1 双亲表示法(方便查找双亲) 使用层次遍历的方法将一个树中的所有结点存储到一维数组中 2 孩子表示法(方便查找孩子) 顺序链式存储结构&#xff1a; 1 使用数组来存储所有结点 2 为每一个结点来设置一个单链表 3 单链表链接的是其所有孩子结点的下标3 双亲孩子结合表示法 …

扬兴 | 选型技巧!晶振在商业显示屏的应用

据有关机构预计&#xff0c;未来五年&#xff0c;商显市场将以每年13-16%的增速发展&#xff0c;预计到2024年将达到1545亿元的规模。伴随着商显屏行业的飞速发展&#xff0c;必然带动电子元器件行业的增长&#xff0c;这也对元器件产品要求不断提高&#xff0c;其中晶振作为数…

【字符串】剑指Offer 05.替换空格(C/C++/Java/Python/Js)

剑指Offer 05.替换空格1 题目2 思路--双指针法3 代码3.1 C版本3.2 C版本3.3 Java版本3.4 Python3版本3.5 JavaScript版本4 总结1 题目 题源链接 请实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。 示例 1&#xff1a; 输入&#xff1a;s “We are…

重磅!马斯克再抛特斯拉股票,去年中国市场份额首次下滑

特斯拉的走势&#xff0c;正在凸显智能电动汽车市场格局的新变化。 几周前&#xff0c;特斯拉首席执行官埃隆马斯克出售了价值近36亿美元的股票&#xff0c;就在三周前&#xff0c;这家全球智能电动汽车领头羊宣布未能实现年度交付目标&#xff08;少了近2.2万辆&#xff09;。…

windows下同时安装mysql5.5和mysql8.0.32

一、安装mysql8.0.32 我先安装的是mysql5.5&#xff0c;如&#xff1a;MySQL5.5安装教程SQLyog安装_柒七的博客-CSDN博客_mysql5.5的安装步骤 1.下载解压 https://dev.mysql.com/downloads/mysql/ 2.创建配置 下载完后&#xff0c;建议解压到一个没有中文的路径&#xff0…

Vue使用ElementUI动态修改table单元格背景颜色或文本颜色

前言 今天遇到一个场景&#xff0c;表格行属性的字典项要针对不同的状态&#xff0c;展示不同的文本颜色&#xff0c;如下图所示&#xff1a; 账号状态这一栏&#xff0c;如果是正常就展示以绿色字体展示&#xff0c;如果是禁用就以红色颜色展示 针对这个需求&#xff0c;我第…

u盘文件被电脑杀毒软件删掉了,怎么才能恢复

案例分享&#xff1a;【我的u盘中毒文件被电脑杀毒软件删掉了&#xff0c;怎么才能恢复啊&#xff1f;&#xff1f;里面有很重要的资料。求高手指点&#xff01;急&#xff01;&#xff01;&#xff01;】——虽然u盘能够存储数据&#xff0c;且体积小巧便于携带&#xff0c;但…

算法:(十二)排序

文章目录12.1 计数排序面试题75&#xff1a;数组相对排序12.2 快速排序面试题76&#xff1a;数组中第k大的数12.3 归并排序面试题77&#xff1a;链表排序面试题78&#xff1a;合并排序链表12.1 计数排序 面试题75&#xff1a;数组相对排序 题目&#xff1a; 给定两个数组&…

UNIAPP实战项目笔记57 发送手机验证码 接入短信SDK

UNIAPP实战项目笔记57 发送手机验证码 接入短信SDK 注册时候需要发送验证 通过验阿里云或腾讯云等短信sdk供应商 实际案例图片 后端接口文件 index.js var express require(express); var router express.Router(); var connection require(../db/sql.js); var user requi…

龙芯处理器7A2000桥片iTOP-3A5000开发板

龙芯处理器7A2000桥片iTOP-3A5000开发板 主要参数 处理器: 龙芯3A5000 主频: 2.3GHz-2.5GHz 桥片: 7A2000 内存: 8GB、16GB DDR4带ECC纠错&#xff08;配置可选&#xff09; 系统: Loongnix 典型功耗: 35W 核心板: 16层 底板: 4层 核心板参数 尺寸: 125*95mm C…

力扣二叉树篇题

题目说明B树如果为空树则不是A树的子结构 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ class Solution {public boolean isSubStructure(TreeNode A,…

VMware ESXi 7.0 Update 3j 更新发布,修复已知问题

VMware ESXi 7.0 Update 3j Standard & All Custom Image for ESXi 7.0 U3j Install CD 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-7-u3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 产品简介…

迁移mysql数据库到opengauss

一、安装chameleon工具1.下载源码git clone gitgitee.com:opengauss/openGauss-tools-chameleon.git2.创建Python虚拟环境并激活安装依赖&#xff1a;yum install mysql-devel gcc gcc-devel python-develpython3 -m venv venvsource venv/bin/activate3.进入代码的目录&#x…