[UE笔记]延迟与延迟补偿

news2024/9/23 7:31:04

Lag即延迟,是多人游戏中常会出现的一个现象。lag compensation即延迟补偿,是一种减少延迟对游戏造成影响的技术。

Ping

多个含义

  • 一种指令(用于验证ip地址是否存在或者主机是否正在运行)
  • 描述服务器需要多长时间响应客户端的输入

在反应时间很重要的多人游戏中,Ping值越低越好

ping Latency(延迟)和Lag(滞后)

卡顿的终极解决方案终究是有一个良好的网络连接

游戏中的Ping有以下特点

  • 作为主机的玩家Ping为0
  • 现实世界不存在无限快的互联网连接
  • 不能假设每个人都会有最好的互联网连接
  • 可以通过在全球不同地区设置服务器来缓解这种情况(离服务器越近意味着与服务器来往的数据需要传送的物理距离越小、Ping越低)
  • 有些非即时性的游戏在很大程度上不受ping影响,如棋类。
  • 快节奏的多人射击游戏则需要重视ping,高ping可能导致无法游玩

延迟补偿

基于所有客户端都会有或多或少的延迟的前提,延迟补偿(lag compensation)是一种处理延迟的技术,在有足够延迟补偿的情况下客户端将会感觉到他们的游戏表现好一些

并且在有足够延迟补偿的情况下,甚至可以给人一种游戏完全没有延迟的错觉

延迟补偿也是在延迟不高的前提下,如果延迟过高延迟补偿也没用

在射击游戏中,玩家往往会注意到在ping高于50毫秒时就有差异了,但是50ms的ping很常见,所以采用延迟补偿技术处理这个

客户端预测

可以拓展阅读:

  • 多人网络游戏服务器开发基础学习笔记 II: 帧同步 | 游戏客户端预测原理分析 | FPS 游戏状态同步
  • 2.快节奏的多人游戏 (第二部分):客户端预测和服务器协调

客户端预测(Client-Side Prediction)允许客户端先移动,通知服务器你在移动。随后在服务器端真正的移动,并将行为复制回客户端

当服务器权威的版本复制回到你的后,你的角色必须重置为到这个权威的位置,而这回导致抖动

例如客户端可能向前移动了3m,而服务器只移动了2m,那么你就得闪回1m。

合适的服务器测预测会将这考虑在内,知道多少移动请求被发送给了服务器,并且只会在服务器和客户端不同步的时候修正

本地处理不重要的东西

当涉及到其他不影响重要玩法的内容时,可以有一些东西在客户端本地完成而不必经手服务器。

例如对于射击这件事。服务器自然应当掌控玩家的射弹是否击中他人。但是诸如枪口火焰或者射击动画则可本地处理。不同游戏的处理方式略有不同:

  • 开火,但是电脑没有生成射弹(等待服务器复制回来)
  • 开火,立马生成代理射弹但是击中敌人不造成伤害(服务器有自己的权威射弹和伤害检测)
  • 开火,客户端生成代理射弹,服务器生成权威射弹,等服务器复制过来时权威版本会替代代理版本

这一切取决于游戏本身的设计和开发者团队的决策,每一种技术都有其自身的优劣,但总要有所妥协。

在这里插入图片描述

详细内容看:[UE笔记]多人游戏中的本地射击效果

插值

当客户端同步了服务器的位置时,如果位置差距过于明显,会有类似“闪回”的操作。这种抖动会下降游戏体验。因此可以将当前位置插值到实际位置,这样就能平滑过渡。缺点是插值慢慢移动到正确的需要时间,而经过了插值过去这段时间,这个位置已经过期了,所以本身就是一种延迟。

外推法

如果你知道对手在往哪个方向跑,你可以假设他们会继续以同样的方式跑步。这种方法子啊快节奏的射击游戏未必适用,也可能会导致比没用外推法的情况下更严重的不精确。

虚幻引擎的角色移动组件

虚幻引擎的角色移动组件高效地采用上述几种方法。如果你的ping非常高,你仍可以移动你的角色,并且角色移动组件将使用你的速度来推断你在其他机器上的位置,以让你的角色在他们的机器上移动地更流畅。

如果需要修正,角色移动组件会使用插值让修正平滑。

如果服务器和客户端位置太难同步,角色移动组件将会传送你回正确位置,这就是Rubber-Banding

因为角色移动组件很好地实现了延迟补偿,我们一般会看到其他玩家在我们的游戏中很流畅地移动。并且即使会出现延迟,我们还有会有顺滑的体验,至少在Ping值太高之前是这样的。

服务器倒带法

服务器会跟踪玩家的位置并存储这些信息到某种移动历史中。客户端攻击时会向服务器发送攻击的细节包括攻击的时间,然后服务器会查看你的攻击时间,倒带时间重新定位玩家到他们之前在这个时间点的位置,根据客户端的攻击信息,查看你的子弹或者射线追踪在服务器权威角色间的实际命中。由此作出是否击中/击杀的判断并反馈。服务器然后将所有角色放回到正确位置并继续游戏。

这导致了一个玩家即使已经跑到掩体后面,仍可能被淘汰,因为可以倒带到跑到掩体前被击中。这对高ping玩家是友好的,但是对其他人可能有糟糕的体验。

你可以选择当某些玩家ping过高就不为他们使用倒带法。

总之为了处理不同Ping值之间玩家的游戏体验,总要有所取舍。如果确信一个游戏的响应性很重要,那就尽我们所能来补偿延迟。

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

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

相关文章

OpenCV实战——使用邻居访问扫描图像

OpenCV实战——使用邻居访问扫描图像0. 前言1. 图像锐化2. 邻居访问扫描图像3. 锐化滤波器4. 完整代码相关链接0. 前言 在图像处理中,有时需要根据某个像素的相邻像素的值计算该像素位置的值。当这个邻域包括上一行和下一行的像素时,就需要同时扫描图像…

JavaScript高级 浏览器的渲染原理与JavaScript代码执行原理

浏览器的渲染原理1. 网页的解析过程2. 浏览器内核1. V8引擎3. 浏览器渲染过程1. HTML解析2. 生成CSS规则3. 构建Render Tree4. 布局(layout)5. 绘制(Paint)4. 回流和重绘解析1. 回流2. 重绘3. web 性能优化4. 合成和性能优化5. 浏…

剑指offer----C语言版----第六天

目录 1. 用栈实现队列 1.1 题目描述 1.2 栈和队列的基础知识 1.3 思路分析 2. 扩展题目——用队列实现栈 2.1 题目描述 2.2 思路分析 1. 用栈实现队列 原题链接: 剑指 Offer 09. 用两个栈实现队列 - 力扣(LeetCode)https://leetcode.cn/…

数据结构集合框架与大O渐进表示法

作者:爱塔居的博客_CSDN博客-JavaSE领域博主 专栏:数据结构 作者简介:大三学生,希望跟大家一起进步!🌹 博客简介:了解数据结构,学习一些关于数据结构的前置知识 文章目录 目录 文章目…

【论文翻译】Deep Learning for Multi-view Stereo via Plane Sweep: A Survey(2021)

一、论文简述 1. 第一作者:Qingtian Zhu 2. 发表年份:2021 3. 发表期刊:CVPR 4. 关键词:MVS、深度学习、综述 5. 核心思想:读到的第一篇深度MVS的综述,总结的很好,内容涵盖了2021年前的研究…

遗传算法python进阶理解+论文复现(纯干货,附前人总结引路)

遗传算法python进阶理解论文复现(纯干货,附前人总结引路)一、简介和相关概念遗传算法简介相关概念介绍二、与其他智能优化算法的比较蚁群算法粒子群优化算法人工神经网络算法模拟退火算法鱼群算法三、必学知识(站在前人的肩膀上&a…

1214. 波动数列(推公式 + DP)

题目如下: 思路 or 题解: 我们可以设: 第一个数为 xxx d {a, -b} 那后续的数为:xd1x d_1xd1​ , xd1d)2x d_1 d_)2xd1​d)​2 … … xd1d2......dn−1x d_1 d_2 ... ... d_{n - 1}xd1​d2​......dn−1​ 根据题意和上面…

(Java高级教程)第二章Java多线程常见面试题-第三节:线程安全集合类和死锁

文章目录一:线程安全集合类(1)多线程环境下使用ArrayList(2)多线程环境使用队列(3)多线程使用哈希表二:死锁(1)概念(2)死锁产生的四个…

(小程序)会议OA项目-首页

目录 一、FIex布局简介 1.什么是flex布局? 2.flex属性 学习地址: 3.flex弹性布局演示 ① 容器的属性 ⑴ flex-direction属性 ⑵ flex-wrap属性 ⑶ flex-flow ⑷ justify-content属性 ⑸ align-items属性 ⑹ align-content属性 二、轮播图组件m…

微信记录怎么恢复?恢复已删除微信历史记录的4种方式

恢复已删除微信历史记录的4种方式 如何在有/没有备份的情况下在 iPhone 和 Android 上恢复旧的或已删除的微信历史记录,如聊天对话、语音消息、照片、图片和视频剪辑?参考本指南,祝您成功恢复微信数据。 关于微信数据恢复 “说真的&#xf…

容器化技术Docker与任务编排

Docker容器化 Docker简介 传统的Java项目部署需要自己进行打包,redis,nignx等中间件需要安装以及进行很多配置,稍微繁琐,而Docker使用了容器化的技术把这一过程封装为一条指令解决,而这取决于它的架构设计&#xff0c…

数值优化之函数高阶信息

本文ppt来自深蓝学院《机器人中的数值优化》 目录 1 函数高阶信息的介绍 2 函数高阶信息的计算 1 函数高阶信息的介绍 hessian矩阵是对称矩阵,最后一个公式是函数关于0的泰勒展开 负梯度是函数下降的最快方向 注意区分Hessian矩阵与Jacobian矩阵,Hess…

9_4、Java基本语法之System、Math、BigInteger与BigDecimal类的使用

一、System类的使用 1、System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。 该类位于java.lang包。 由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实 例化该类。其内部的成员变量和成员方法都是static的&am…

【算法题解】7. 反转链表

文章目录题目解法一:迭代解题思路代码实现复杂度分析解法二:递归解题思路代码实现复杂度分析题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。来自:leetcode 解法一:迭代 解题思路 使用…

广州车展智能卷王:集度ROBO-01的取与舍

作者 | 德新 编辑 | 王博2022年的最后两天,今年最后一个A级车展在广州开幕。由于种种原因,不少车企匆忙备战或者干脆缺席,这届展会不如往届热闹。但也有憋了大招的选手,比如集度。 12月30日上午,集度在一场非常短的发布…

11-内部类and 12-集合初步

文章目录11-内部类链接外部类使用.this 和.new匿名内部类12-集合初步思考1&#xff0c;List<Apple> apples new ArrayList<>();思考2&#xff0c;如何初始化一个collection思考3&#xff0c;Pet关键字思考4&#xff0c;关于ListIterator这个双向迭代器思考5&#…

保护性暂停设计模式

目录 保护性暂停设计模式 获取结果 产生结果 总代码实现 测试 增加超时效果的Guarded suspension get(long timeout) 测试 保护性暂停设计模式 Guarded Suspension 即 保护性暂停; 是一种等待唤醒机制的一种规范 ,也可以理解为使用中设计模式,Java的API很多都按照保护性…

【免费开放源码】审批类小程序项目实战(活动审批端)

第一节&#xff1a;什么构成了微信小程序、创建一个自己的小程序 第二节&#xff1a;微信开发者工具使用教程 第三节&#xff1a;深入了解并掌握小程序核心组件 第四节&#xff1a;初始化云函数和数据库 第五节&#xff1a;云数据库的增删改查 第六节&#xff1a;项目大纲以及制…

系分 - 面向对象的方法【概念】

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 系分 - &#xff08;概念&#xff09;面向对象的方法 面向对象的方法&#xff08;OO&#xff0c;Object-Oriented&#xff09;是一种基于对象模型的程序设计方法&#xff0c;包括面向对象的分析&#xff08;OOA&a…

【iOS】内存管理

文章目录前言理解引用计数引用计数原理属性存取方法中的内存管理自动释放池保留环以ARC简化引用计数使用ARC时必须遵守的命名规则变量的内存管理语义ARC如何清理实例变量覆写内存管理的方法在dealloc方法中只释放应用并解除监听前言 内存管理&#xff1a; 在Objective-C这样的…