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

《Cloudborn》GDC亮相:云原生游戏架构设计与挑战解析 云原生是一种构建和运行应用程序的方法,它充分利用云计算的优势,如弹性伸缩、分布式和微服务架构。其核心原理在于将应用设计为一系列松散耦合的服务,通过容器化部署在动态编排的云基础设施上。这种架构的技术价值在于能够实现更高的可用性、可扩展性和更敏捷的迭代速度。在游戏开发领域,云原生理念正催生新的应用场景,例如构建大规模、持久化、状态实时同步的虚拟世界。本文以《Cloudborn》项目为例,探讨了实现此类愿景所需面对的核心挑战,特别是**状态同步**的规模与实时性问题,以及如何通过**动态世界状态**的管理技术来构 阅读详情

客户端-服务端之间的位置同步一直是游戏开发中的一道难题,特别是还涉及到复杂的物理运动时。对于这个话题,来自《太空工程师》游戏的工程师在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中:
在这里插入图片描述

OAI骨关节炎数据集申请与DICOM下载全流程避坑指南 医学影像分析中,DICOM格式是存储与交换CT、MRI等数据的通用标准,其元数据Tag承载着像素间距、层厚等关键物理信息,直接影响定量分析的准确性。在骨关节炎研究领域,OAI数据集因样本量大、随访时间长而成为高价值资源,但获取需通过NDA协议申请,并借助nda-tools命令行工具完成TB级影像的批量下载与断点续传。这一流程涉及浏览器环境配置、DICOM格式转换及Python预处理等工程环节,任一细节疏漏都可能导致数据读取异常或分析偏差。掌握从申请到落地的完整链路,能显著提升医学影像AI研究的效率与可复现性 阅读详情

相关推荐

模拟IC设计避坑:手把手教你用Cadence仿真恒定跨导轨到轨运放(附完整工艺库文件)

本文详细解析了使用Cadence仿真恒定跨导轨到轨运放的全流程,涵盖电路原理、工艺库配置、尺寸设计及仿真分析。通过1:3电流镜补偿技术实现跨导稳定,提供CSMC 0.25um工艺下的实战案例,帮助工程师规避设计陷阱,提升模拟IC设计效率。

weixin_30952535的博客 495

Unity 后端服务器 Photon(二) 快速搭建多人联机游戏

如何最快的搭建一个 Unity 上的多人游戏?答案也许是自己搭建一个游戏服务器,也许是 LAN 解决方案,但是最快的解决方案还是使用成熟的第三方后端服务,我找到了 Photon ,一个看起来不错最后证实也挺靠谱的游戏后端解决方案。一个游戏服务器,最主要的就是对不同参与者的事件同步和世界状态的同步,所以根本还是在于和服务器的长连接上,至于游戏中的用户体系,积分体系,货币体系这些,就是属于大后端的范畴...

carotadream的博客 8424

从零到一:基于K375S主控的机械键盘优联无线化改造实战

本文详细记录了基于罗技K375S主控进行机械键盘优联无线化改造的全过程。从改造动机、核心原理与物料准备,到电路设计、PCB打样、焊接调试,逐步拆解了将优联技术集成到自定义机械键盘中的实战步骤。项目最终实现了低延迟、高稳定性且支持多设备连接的优联无线机械键盘,为DIY爱好者提供了高性价比的改造方案。

h0i1j2k3l的博客 601

太空工程师稳定服务器,【图片】【服务器搭建】傻瓜式搭建属于自己的太空工程师服务器!!!!!_太空工程师吧_百度贴吧...

该楼层疑似违规已被系统折叠隐藏此楼查看此楼自定义客户端如果要创建自己的客户端,则必须正确创建请求。远程API使用HMAC(HMACSHA1)来计算来自特定数据的散列。HMAC正在使用私钥。不要与任何人分享此密钥。你必须从字符串(行)计算哈希:URL - 包括查询参数Nonce - 随机字符串,只能使用一次,可以是数字日期 - UtcNow,格式r,RFC1123模式,必须添加到标题这转换为来自U...

weixin_33308579的博客 965

手把手教你用STM32F103的GPIO模拟MIPI RFFE协议(附完整代码与逻辑分析仪调试技巧)

本文详细解析了如何使用STM32F103的GPIO模拟MIPI RFFE协议,包括协议核心、硬件准备、时序模拟、寄存器操作及逻辑分析仪调试技巧。通过实战代码和波形分析,帮助工程师解决电平转换、奇校验处理等常见问题,提升通信稳定性与效率。

weixin_30292745的博客 284

自动驾驶预测决策规划八股

预测规划八股个人总结。

dawushixiange的博客 479

太空工程师修改服务器,新手向游戏数据修改(电力部分)

该楼层疑似违规已被系统折叠隐藏此楼查看此楼我看人家发帖都先上图 咱也来两张前两天写了修改推进器的教程 今天我发现电能源也很有搞头 哈哈下边是正题 大家修改最好做成MOD 有问题可以直接删掉MOD就OK 了-----------------------我是分割线----------------------------发电设备修改路径E:\游戏目录\Content\Data\CubeBlocks 文...

weixin_36283702的博客 2156

史上最牛逼的导航网站(很全很详细)

今天,给大家推荐47个聚合型的导航网站 每一个都收录上百个网站,1个能顶100个,丝毫没有夸张的成分。 (推荐收藏) 设计师导航网站 01 优设导航 https://hao.uisdc.com/ 设计师必备的导航网站,包含设计工具、素材资源、字体设计、配色方案、酷站模板等。 界面清晰无广告,收录网站超过520个。 02 设计导航 http://h...

孙叫兽的博客 7万+

理解 Linux 动态库加载:LD_LIBRARY_PATH

flyfish

二分掌柜的 347

即插即用系列(代码实践) | CVPR 2025 WPFormer:小波与原型增强Transformer——表面缺陷检测SOTA,专治弱缺陷与杂乱背景

摘要:本文提出了一种基于小波变换和原型增强的Transformer模型(WPFormer),用于像素级表面缺陷检测。该模型针对工业场景中微弱缺陷难以识别和杂乱背景干扰严重的问题,创新性地将小波变换引入Transformer的注意力机制,通过频域信息分离噪声与边缘特征,同时利用原型向量引导查询,实现了更精准的缺陷定位。核心模块包括小波增强交叉注意力(WCA)和原型引导交叉注意力(PCA),适用于工业缺陷检测、伪装目标检测和医学图像分割等任务。代码已开源,支持即插即用集成到现有框架中。

分享顶会顶刊论文即插即用模块 301

ArtMate —— 美术公开课智能体开发全记录

本文档详细描述了一款专为中小学美术公开课设计的智能教学助手的开发过程。该智能体融合了多模态感知、自然语言交互、风格迁移与智能评价等技术,旨在辅助教师开展生动、高效的美术鉴赏与创作课程。全文包含需求分析、系统架构设计、核心模块代码实现、交互界面搭建及完整运行示例,并配有详尽的行内注释和设计思想阐述,为教育技术开发者提供一份可落地、可扩展的参考方案。

huanghm88的专栏 153

【Linux网络】TCP 服务器并发处理多客户端:从 fork 分发到双重 fork 彻底消灭僵尸进程

拆解 TCP 服务器并发演进链:fork 分发连接、SIGCHLD 循环回收僵尸、双重 fork 交孙进程给 init 收养,并给出模型选型与线上排错对照。

2301_78967866的博客 427

嵌入式工程师必学(118):MCU的硬件定时器和中断

大多数微处理器都有一个或多个可编程硬件定时器,这些定时器包括对中断的支持。可以有不同类型的计时器,用于不同的应用程序。例如,LPC1768 具有四个 32 位通用定时器、一个看门狗定时器、一个重复中断定时器、一个系统滴答定时器、一个正交编码器接口、6 个 PWM 输出和一个支持中断的实时时钟。硬件定时器用于计时和计数作,允许处理器在 timer 进程运行时继续执行其他进程。硬件定时器是一种使用 clock 信号来增加 register 的电路。

码农17年的博客 211

LangGraph 本地 build 频频翻车,最终在服务器跑通流式对话

先说结论:我本地那个,一次都没成功过。三次,三次,全挂在拉镜像上。而顺得像刚上过油。这就很像我高中那辆自行车:骑着能走,一上锁就坏。那天晚上我盯着终端里那行红字看了很久,想的不是技术方案,想的是——为什么同一个工具,可以一边让我觉得自己很行,一边让我觉得自己不太行。

人工智能AI技术 115

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork

本文详解多进程TCP服务器的实现原理,从单进程并发瓶颈出发,通过fork分离连接接收与服务职责。重点解析文件描述符继承机制、僵尸进程问题及双重fork解决方案,最终构建高效、稳定的多进程服务器模型,并说明服务器重启时可能因端口未释放导致绑定失败的原因。

2402_87731470的博客 2395

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

自建 Git 服务器和裸仓库差在哪:要能提合并请求

在一台 Linux 上 git init --bare 就能自建 Git 服务器,但它只能推拉代码,没有网页、合并请求、评审和按仓库分配的权限。对照裸仓库和 AngusGit 各自能做什么,再走一遍在 AngusGit 上发起合并请求的最短路径,以及已有裸仓库怎么完整搬过来。

AngusTester 322

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

架设一台NFS服务器

3、将/home/tom目录仅共享给192.168.100.136这台主机,并只有用户tom可以完全访问该目录。注意:tom是一个用户目录,并且在客户端创建tom用户一定与服务端的tom用户的uid/gid保持一致。2、开放/nfs/upload目录,为192.168.100.0/24网段主机可以上传目录,并将所有用户及所属的组映射为nfs-upload,其UID和GID均为210。1、开放/nfs/shared目录,供所有用户查询资料。架设一台NFS服务器,并按照以下要求配置。

2401_87595340的博客 238

轻量点对点定时备份方案:个人文档与服务器文件跨机同步实践

本文探讨了轻量级文件备份场景下的实际需求与解决方案。针对个人文档及小型服务器备份,传统BAT脚本虽易上手,但存在断点续传差、安全缺失、维护困难等短板。作者提出理想方案应具备点对点传输、断点续传、加密传输、版本管理、文件过滤及自动清理等能力。最终选用松鼠备份工具,实现稳定、低运维成本的跨机同步,尤其适合中小型场景,强调“稳定省心”优于复杂功能,是小团队和个人运维的高效之选。

2501_93776716的博客 208

安徽京准:NTP网络校时服务器在化工厂网络部署要点

安徽京准:NTP网络校时服务器在化工厂网络部署要点

238

Linux epoll 一篇讲透:从 select/poll 到红黑树、LT/ET,再到完整 TCP 服务器

一万个客户端已经连上服务器,眼下只有十个客户端发来了数据。服务器怎样把时间花在这十个连接上?理解这个问题,就抓住了 epoll 的主线。接下来,我们沿着“为什么需要它 → 接口怎么用 → 内核如何实现 → LT/ET 怎么写 → 完整服务器怎么运行”的顺序,把知识连起来。**阅读基础:**了解socketbindlistenaccept的基本用途即可。本文示例面向 Linux,服务器使用 C++17,实验脚本使用 Python 3。

2601_94861874的博客 195

把电脑变成一台“假“GNSS 设备 —— 一个蓝牙 SPP 服务器从零到联调

本文介绍如何用Qt6实现一个蓝牙SPP服务器(H11BtServer),将电脑模拟为一台可被发现的GNSS设备。该服务器支持经典蓝牙SPP协议,注册SDP服务并监听连接,响应AT命令(如AT+DEVINFO),每秒主动推送带正确校验和的NMEA帧($GNPOS/$GGA等),数据基于时间驱动正弦与随机扰动,实现位置、精度等参数动态变化。通过解析行式协议、计算校验和、严格对齐字段顺序,可在无真实硬件情况下联调RTK客户端(如rtklib SDK或手机App),完整验证数据链路。代码结构清晰,参数集中配置,易于

Hi20240217的博客 137

Linux网络编程:彻底理解IO多路复用select!从fd_set位图、读写就绪到手写TCP多客户端字典服务器

在前面的Linux网络编程中,我们已经学习了五种经典I/O模型:其中,我们通过 配合: 将文件描述符设置为非阻塞模式。例如: 这样,在没有数据可读时: 可以立即返回: 并设置: 而不需要让当前线程一直阻塞等待。但是,这又引出了一个新的问题。假设我们的TCP服务器同时连接了100个客户端: 如果使用简单的非阻塞轮询: 服务器就需要不断检查这些Socket。即使其中99个客户端都没有发送任何数据,服务器仍然可能反复调用它们对应的 。显然,这种方式可能产生大量无意义的系统调用。我们真正希望实现的是:能不能让内核

Face_FeaR的博客 657

【服务器数据恢复】RAID5阵列双盘掉线Oracle+OA系统的数据恢复案例

某医药公司服务器组建RAID5磁盘阵列,阵列内两块硬盘先后离线,直接造成服务器宕机。服务器操作系统为RedhatLinux,承载基于Oracle数据库搭建的OA业务系统,业务数据价值高、恢复时效要求紧急。由于该OA配套Oracle版本早已停止技术支持,客户需求为:完整恢复业务数据,同时尽可能复原原有操作系统环境。

beiya123的博客 127

BarTender异地客户端怎么连服务器?

适配场景:制药、汽车等,对网络环境、合规规范存在较高要求的企业。处在外部网络的异地计算机,如果要和总部服务端交换数据,就要建立加密通信隧道,VPN、云组网都属于这类网络实现方式。经常收到这样的技术咨询:标签软件的服务端部署在总部,外地车间、异地仓库、外协工厂的计算机分属不同局域网,这类情况下是否可以实现互通?这套软件本身不支持公网直接访问总部服务端,需要构建安全的虚拟通信链路,将分散各处的计算机纳入同一个虚拟内网环境。异地分厂、仓库以及外协作业点位,设备不必回到总部内网,就可以运行标签相关软件。

2601_96728078的博客 422

银河麒麟高级服务器操作系统日志采集标准处理流程

本文档提供银河麒麟高级服务器操作系统标准化日志采集流程,便于统一技术支持标准、缩短问题定位周期,且确保采集的信息完整、准确、可直接用于根因分析。本文档适用于技术支持工程师及具备操作系统操作权限的技术人员,覆盖银河麒麟高级服务器操作系统,适用阶段为服务器故障排查、问题复现、根因分析阶段的日志采集工作。执行1次,快速定位负载类型# 系统整体负载与CPU占用# 内存与虚拟内存状态# 进程维度信息(按CPU/内存排序)# 异常进程排查。

qq_39496637的博客 312

IO模型与并发服务器

调用 IO 函数(recv)时,如果内核缓冲区没有数据,进程直接阻塞休眠,直到数据到达才唤醒、拷贝数据、函数返回。

miracleAshing的博客 190
上一篇: 游戏服务器开发指南(六):条件判断永远放在状态变更前
下一篇: 游戏服务器开发指南(七):资源流通保证先减后增的顺序
长三月
博客等级 码龄9年 228粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值