近年GDC服务器分享合集(二): 《太空工程师》中基于预测物理的多人游戏

news2024/11/24 17:53:19

客户端-服务端之间的位置同步一直是游戏开发中的一道难题,特别是还涉及到复杂的物理运动时。对于这个话题,来自《太空工程师》游戏的工程师在GDC 2023上为我们带来了他们的分享——《《太空工程师》中基于预测物理的多人游戏》(Predicted Physics Based Multiplayer in ‘Space Engineers’)。PPT可点击链接获取。

原PPT内容较长,足有120多页。本文取其精华以飨读者。

《太空工程师》是一款关于在太空中建造、探索和生存的沙盒游戏。游戏中所有的物品都可以被组装和拆解。玩家可以建造属于自己的太空飞船和宇宙空间站,还可以选择相互合作或者战斗。

在这里插入图片描述

对于这样一款涉及到复杂物理运动的游戏,有不少同步相关的问题需要解决。例如:

  • 运动状态是以服务端还是客户端为准?
  • 当遇到延时时,如何保证客户端的运动流畅?
  • 如果客户端和服务端不同步,应该如何做修正?
  • 对于有强关联性的一组物体(如太空飞船和在它表面的宇航员),它们的同步较容易产生状态不一致,这时应如何解决?

带着这些问题,我们看下《太空工程师》的应对策略。我们会从一个最简单的同步方案开始,一步步进化成完整的方案。

首先考虑基础同步方案(Naive Postion Updates)。主流的同步方案可以按服务端承担责任的轻重,粗略分为两大类:一类是客户端将状态发给服务端,服务端只做转发;另一类是服务端有一个完整的物理世界,运动状态以服务端每帧的计算结果为准,客户端只发送玩家操作给服务端,然后使用服务端的推送结果来修正当前的运动状态。由于《太空工程师》中的物理交互非常多而且重要,所以选择后面一种方案。

通信协议基于UDP,只对部分类型的包保证可靠性。这样做可以兼顾延时和可靠性。

状态推送采用一种分层AOI的策略。例如,玩家操纵的人物只接受他周围3km以内物体的更新;在20米半径内每4帧更新一次,在接近3km的地方降低到每60帧更新一次。

在这里插入图片描述
服务端每帧向客户端推送状态消息,在存在延时的情况下,包可能乱序到达,甚至出现丢包的情况。

请添加图片描述解决办法是在服务端使用播放延迟缓冲器(PDB,playout delay buffer)。这个缓冲器包含4个包的存储位,每帧接收一个客户端的包,插入缓冲器中,并与已存储的包一起按序号顺序排列。如果存储的包总数大于4个,那么会把序号最小的一个包移出缓冲器,并推送到客户端。例如,服务端先后接收到2、5、3三个包,会按下图排列成2、3、5的顺序。

在这里插入图片描述使用PDB的好处是可以在一定范围内将乱序的包重新排列成有序。缺点是会增加额外的延迟时间。

游戏中会用转子、活塞之类的部件把不同物体组合到一起。整体会运动,每个部件也会独立运动。如果为每个部件单独做运动插值,那么合并起来运动必然是断裂的。解决办法是使用相对位置同步(Relative Position Updates),具体来说是先定义物体之间的层次关系,再对子级物体做相对于它的父级物体的运动插值,即本地空间中的运动插值。一般选择被控制的物体或者最大的物体作为根级物体。

在这里插入图片描述接下来我们考虑延时(Lag)对同步的影响。这里的延时是指从按下操作键到屏幕上出现反馈的时间。这个时间通常是难以忽视的,例如,当ping为50ms时,由于网络传输、渲染、GPU等多个步骤的时间累积,估算总延时高达200多ms。这里引述了卡马克的一句话:“我发送一个IP包到欧洲,速度竟然快过发送一个像素到屏幕上”。

在这里插入图片描述对于这样高的延时,如果客户端完全等待服务端推送才能动起来,那么玩家体验必然很差。解决办法是预测服务端的状态(Basic Prediction),让客户端先动起来。

预测方法是:客户端每帧向服务端同步当前的操作和位置,并且在本地保存同步的历史记录;服务端接到消息后推送给所有客户端;客户端接到服务端推送后与历史记录比较,若有误差则修正当前运动状态。
在这里插入图片描述有时候客户端或者服务端会出现掉帧,掉帧会影响同步的正确性。出现掉帧时,我们可以让客户端临时提升或者降低帧频,以保证和服务端一致。

当客户端接收到服务端的推送和本地历史记录不一致时,即为预测不同步。这时我们需要按服务端的推送数据来对客户端的运动状态做预测修正(Prediction Correction)。例如,在下图的示例中,服务端某个时刻出现了一个新的障碍物,这个情况暂时还没能同步到客户端那边。因此服务端和客户端会有不同的运动状态:服务端会尝试碰撞障碍物但进不去,然后沿着其表面向上运动;客户端会进入到障碍物所在的位置再向上,直到接收到服务端的推送与本地记录不符,再修正成退出障碍物所在区域。
在这里插入图片描述由于浮点运算等原因,服务端推送结果不可能与客户端历史记录100%匹配,所以我们只在差异足够大的情况下做修正。

另一个要解决的重要问题是时间矛盾(Time Paradox),即由于网络传输延时导致的客户端、服务端状态不一致,多见于多个运动物体发生交互时。例如,在太空中,宇宙飞船和宇航员同样以50m/s的速度向左运动,宇航员试图进入到船舱中。由于存在网络延时,客户端的宇宙飞船运行状态落后于服务端2.5m,导致客户端看到宇航员正对着舱门,而服务端对着墙壁。
请添加图片描述这样造成的结果是:客户端上宇航员成功进入船舱,而服务端会碰壁,稍后服务端把碰壁消息推送给客户端,客户端据此修正,又将宇航员移出船舱。
在这里插入图片描述如果纯靠客户端修正的话,玩家体验不佳。优化方法是使用相对预测(Relative Prediction)。

具体做法是:当宇航员接近宇宙飞船时,将宇航员设为飞船的子物体,并且将服务端的状态立即通知客户端做修正。这里的父子物体概念与前面通过物理限制连接在一起有所不同,这里的概念是逻辑上的。将宇航员和飞船绑定后,宇航员的运动状态更新改为相对飞船的相对运动。
请添加图片描述当发生绑定时,客户端的宇航员状态要根据服务端的相对位置做修正,这个过程使用插值保证平滑过渡。
在这里插入图片描述最终结果就是不再会出现客户端上宇航员进舱后又被拖出来的尴尬场景。

这里需要提及一下客户端物理设置的标准。标准是:所有动画驱动的物体设置成静态刚体。当物体切换为受控状态时,对应刚体也切换成动态刚体,并且向客户端持续推送运动状态更新。如果该物体有父级物体,那么需要继承父级物体的运动。
在这里插入图片描述最后是对本次分享整体思路的总结,都浓缩在下张PPT中:
在这里插入图片描述

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

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

相关文章

在 openEuler 22.03 上安装 KubeSphere 实战教程

作者:老 Z,中电信数智科技有限公司山东分公司运维架构师,云原生爱好者,目前专注于云原生运维,云原生领域技术栈涉及 Kubernetes、KubeSphere、DevOps、OpenStack、Ansible 等。 前言 导图 知识点 定级:入…

域泛化(Domain Generalization)相关知识学习

文章目录 一、域泛化综述1)Domain定义2)Domain Generalization(DG)定义3)一些相关领域与DG的区别4)领域泛化的方法表示学习领域不变表示学习①基于核的方法( kernel-based methods)②…

python自动化(一)基础能力:9.yaml文件详解

一、什么是yaml文件 yaml 是专门用来写配置文件的语言——可以用例作为自动化框架的配置文件yaml文件其实也是一种配置文件类型,后缀名是.yaml或.yml都可以个人认为比yaml比json格式更方便 二、yaml语法规则 YAML 语言(发音 /ˈjməl/ )的设…

电力应急指挥需要哪些终端设备?

在电力应急现场,我们可能会面临很多复杂的情况,当发生电力险情时,现场可能会面临断电、断网、无路等问题。此时应急指挥中心很难第一时间掌控现场情况,指挥中心无法快速做出反应,无法对现场情况做出高效的应急处置决定…

Spring Boot源码中设计模式应用浅析

文章目录 1. 工厂模式1.1 详解 DefaultListableBeanFactory 2. 单例模式1.1 详解 DefaultSingletonBeanRegistry 3. 观察者模式4. 适配器模式5. 模板方法模式 背景:大家好,我是冰点。最近有网友反馈,他在面试过程中被面试官问到,设…

NVDIA GPU参数列表: 3090,4090, A40, A30,V100, A100, A800性能参数

GeForce RTX 4090 GeForce RTX 3090 Ti (左) GeForce RTX 3090(右) A40: The NVIDIA A40 accelerates the most demanding visual computing workloads from the data center, combining the latest NVIDIA Ampere …

如何在Spring Boot服务端实现公网远程调试并进行HTTP服务监听?具体涉及到的步骤包括端口映射等

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

Hadoop学习---7、OutputFormat数据输出、MapReduce内核源码解析、Join应用、数据清洗、MapReduce开发总结

1、OutputFormat数据输出 1.1 OutputFormat接口实现类 OutputFormat是MapReduce输出的基类,所以实现MapReduce输出都实现了OutputFormat接口。 1、MapReduce默认的输出格式是TextOutputFormat 2、也可以自定义OutputFormat类,只要继承就行。 1.2 自定…

C++标准库算法std::upper_bound示例

C标准库算法std::upper_bound示例 贺志国 2023.5.25 C标准库算法std::upper_bound使用二分查找算法在已按升序排列的序列中返回指向第一个大于给定值的元素的迭代器,例如:已按升序排列的序列为{100.0, 101.5, 102.5, 102.5, 107.3},第一个大…

如何优化供应商采购系统,提升供应商管理和采购流程效能

随着企业采购向数字化转型的发展,供应商采购系统的使用也越来越广泛。如何优化供应商采购系统,提升供应商管理和采购流程效能,已成为企业面临的重要问题。本文将为大家介绍一些优化供应商采购系统的方法,以提升采购效率和管理水平…

zabbix自定义监控

一、案例操作:自定义监控内容 案列:自定义监控客户端服务器登录的人数 需求:限制登录人数不超过 3 个,超过 3 个就发出报警信息 1、自定义监控内容的操作步骤 1.1 在客户端创建自定义 key 明确需要执行的 linux 命令 who | …

RocketMQ基础入门

一、MQ介绍 1.1 为什么要用MQ 消息队列是一种先进先出的数据结构 MQ 其应用场景主要包含以下3个方面 1.1.1 应用解耦 系统的耦合性越高,容错性就越低。以电商应用为例,用户创建订单后,如果耦合度调用库存系统、物流系统、支付系统&#…

mp3格式怎么弄?制作mp3格式文件,教您2个有效的方法!

案例:如何制作mp3格式的文件? 【我想制作自己的mp3文件,但不知道如何开始。有没有小伙伴可以分享一下制作mp3格式的方法?】 MP3是一种非常流行的音频格式,被广泛用于数字音频的存储和传输。制作mp3格式文件可以让您方…

推荐|x86视觉运动控制一体机VPLC710

正运动技术始终围绕客户需求不断迭代升级产品及开发,积极探索工控自动化高质量发展新路径,着眼于全力为客户提供更优质的产品与服务,特此开发了一款可满足全场景高速高精及中大型产线设备应用需求的x86的IPC形态控制器。 VPLC710产品简介 VP…

数字化转型入门

前言 数字化转型是指企业或组织利用数字化技术和数字化思维来提高业务效率、客户体验和创新能力的过程。在当今的数字化时代,企业或组织要想在激烈的市场竞争中获得竞争优势,就必须积极推进数字化转型。本指南将从数字化转型的概念、影响、挑战、关键因…

删除Windows11和WIN10桌面图标小箭头

方法一: 1.右键“开始”菜单,找到“运行”,输入命令 regedit ,打开“注册表编辑器” 2.在“注册表编辑器”左侧窗口,按照以下路径找到对应项 HKEY_CLASSES_ROOT\lnkfile 3.选择右侧窗口的lsShortcut项,右击lsShortcut项,点击删除选项,将lsShortcut删除即可 4.重启电…

Java:mybatis-plus-generator-ui 基于Mybatis-Plus的代码自助生成器

引用官方文档上的简介: 提供交互式的Web UI用于生成兼容mybatis-plus框架的相关功能代码,包括Entity,Mapper,Mapper.xml,Service,Controller等 ,可以自定义模板以及各类输出参数,也可通过SQL查询语句直接生成代码。 文档 githu…

Day51【动态规划】309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 力扣题目链接/文章讲解 视频讲解 记住昨天的回顾总结提到的:应该灵活利用 dp 数组的下标描述所有状态 动态规划五部曲 1、确定 dp 数组下标及值含义 dp[i][j],第 i 天状态为 j,所剩的最多现金为 dp[i…

2023年中国AI芯片行业市场现状及未来发展趋势预测

2023年AI芯片报告汇总了60家国产AI芯片厂商,大致按如下应用类别进行归类:云端加速、智能驾驶、智能安防、智能家居、智能穿戴、其它AIoT。对于每一家筛选的公司,我们从主要产品、核心技术、应用场景、市场竞争力、发展里程碑等方面对公司进行…

vue做一个一直自增加载且永远不会超过百分之九十九的数值 制造正在加载假象

我们在src跟目录下创建一个utils目录下面创建一个continuousLoading.js 参考代码如下 let value 0;export default function(callback) {const timer setInterval(() > {if (callback&&(value || value 0)&&value < 99) {value 1;callback(value);}…