开放大世界的碰撞与物理

        众所周知,物理开销一直是 CPU 的一个大头,而且还很容易出问题。对于开放世界,该如何进行物理运算,以及采用什么方案计算碰撞。

        本文针对这个问题做了一些细微的研究,算是对 Unity 下的解决方案有了一个大致的方向。

1、现有物理方案

        目前 Unity 里可用的物理方案(现成的)有3种:

  • Unity 默认的 PhysicsX:默认的物理,大家用得最熟的就是这个;
  • Unity Dots Physics:在 Dots 系统中的物理;
  • Unity Havok Physics:基于 Havok 的物理系统;

        这里我们对三种方案都进行一个测试:

1、底部放置一个 Mesh (地形),尺寸约 2000*100*800,顶点数 1229,三角面 2171 :

2、之后在空中 100*100 区域的范围洒落 球/立方体 碰撞:

3、等方块/球落地后基本稳定、帧数不变之后,记录当前的实体数量;

4、记录帧数刚好在 60/45/30 时对应的实体数量;

       注:这里的测试方案我是选择了对于物理系统最不友好的方式(大量物体都积累在同一区域相互碰撞),如果物体均匀分散,性能压力会小很多。但进行压力测试时,都是考虑的最差情况。

        这里我在小米9上进行了真机测试,结果如下:

        三种物理系统的差别并不算大,Havok 的性能会好一些,而 Unity.Physics 和 默认的 PhysicsX 没有太大差异。究其原因,Unity 的默认碰撞 PhysicsX,其实也是多线程。

2、开放世界物理方案

        通过上文的测试,无论采用什么方案,如果数量到达了数千的地步,都是接受不了的。如果考虑到开放世界中的场景丰度:石头、树木、关卡交互等,数量可以非常庞大。考虑到 小米9 并不是支持的最低端手机,因此建议同时激活的带碰撞的物体要一直控制在 1000 以下。我后面也没有纠结物理系统了,就直接使用 Unity 的 PhysicsX 就行了(会的人多,实现起来简单),即便使用其他的方案也不会有质变

        之前看到一个方案,就是通过射线检测来替代物理碰撞(《腾讯游戏开发精粹Ⅱ》第10章 物理查询介绍及玩法应用、第11章 基于物理的角色翻越攀爬通用解决方案),也能大大降低性能消耗。我这里简单介绍下这个方案的思路:

        在玩家的移动方向上打射线(不一定只能从上往下打),越靠近玩家射线的精度越高。在计算时,先在最远处检测,如果检测到有障碍,便激活中距离的检测(精度更高、性能开销也越大);如果在中距离检测到了,便激活近处的射线检测(此时检测到的数据就与玩法相关,以实现爬墙、跳跃等规则)。
        这种分级射线检测的好处,在玩家处于空旷地块时,可大幅减少射线检测的频率。此外,使用射线代替碰撞,能减少大量物理开销,也能减少因为物理碰撞产生的各种飞天遁地等表现异常。

3、岛屿轮廓的碰撞

        我们的地形数据是生成的高度图,岛屿形状其实并不能在 CPU 中体现,自然也无法获取到类似于网格这种的碰撞数据。需求上,有需要船只会被岛屿边缘弹开(有类似推开的物理效果)的功能。针对海岛,我设计了基于有向距离场(Signed Distance Function,以下简称 SDF)的碰撞方案。

        关于 SDF,建议先参考以下文章:

Unity 手把手教你实现有向距离场(SDF)图像生成工具(1)【猴子都能学会】 - 哔哩哔哩本文将采用Dead Reckoning算法实现一个有向距离场的生成工具,并实现一个如下的简单变形效果,当然对于SDF应用远不止于此,诸如原神的脸部阴影之类的,这个网上很多就不在这里详细讲了。该算法的优势相较于遍历全局耗时更少,虽有一定的精度下降,但相较于近似方法消除了产生的棱角,毕竟对于一张1024*1024的图要遍历全局的时间都够下楼买杯奶茶再上来了,而采用该算法可以在2秒内计算完成。 首先先创建一个ComputeShader和一个脚本如何创建ComputeShader给ComputeShader命名为icon-default.png?t=N7T8https://www.bilibili.com/read/cv24786763/        在我们游戏中,其至少有以下2个功能:

  • 海水波浪计算:在岛屿靠近岛屿区域时,海浪高度(强度)减弱,且海浪不能漫过岛屿。

  • 行船碰撞计算:开船不能直接撞上岛屿,也不能直接生硬拦停,通过SDF图可以拟合渐变实现碰撞转向的效果。

        因为这个值需要在CPU、GPU都读取,在Unity2020+中可以使用 RawBuffer 辅助两边的数据共享。这里使用实时在线生成的方式生成SDF图,由GPU进行计算。

        动态生成的好处是能支持动态的阻挡物,而且全局唯一一份(只在船或相机附近生成)固定大小的图,更为节省内存。但缺点是生成的结果不能立即拿到,需要一定时间进行生成,可能在2s左右才能获得最终结果(由于海洋主题中,船只的行进都是较慢的,所以问题不大)。

        以玩家(相机)为中心,生成一张 1024*1024 的贴图,数据存储为 RGBA 32 bit,也就是每个像素4个字节。其中RG表示最近障碍物的距离,BA表示法线。整张图的重构逻辑依旧是AOI的九宫拆分:

        SDF图的重建逻辑:初始化时,以玩家(相机)为中心生成一张1024*1024的贴图。玩家从A点移动到C点:当玩家在B点(黄色区域时)仍使用当前数据。当玩家移动到C点(离开黄色区域)则开始按照C点为初始点构建新的图(重新构建时有4~6个格子的数据可以复用,但一般还是直接整张图重建)。
        在 ComputeShader 中,每帧进行一次迭代,每个像素计算周围8个格子,类似于流场的做法。虽然理论上,最坏情况需要 52 万次才能迭代完成,但实际应用中收敛次数不会这么多,具体需要测试。预测会在2~3s内完成收敛(迭代30~60次)。

        之后,CPU 和 GPU 都可以通过 SDF 图数据来计算了。

4、总结

        对于开放大世界的物理碰撞,根据现有解决方案,需要将带物理的物体控制在 1k 以下,就能很好地在手机上运行并支持玩法。

        对于特殊的需求(例如翻墙、攀岩)等,通过射线手段进行辅助检测,减少物理碰撞的开销。基于 GpuTerrain 实现的地形,则需要通过生成 SDF 图的方式来辅助碰撞,基本上能满足需求。

        对于一些对碰撞精度要求较高的需求,也可以通过取巧的方式来实现。(例如,如需要玩家在前进过程中自动绕开一些小型灌木。这种如果不能上物理和寻路、RVO,可以将灌木的数据记录在地块信息图中,在玩家经过时播放一个向左/向右的躲避的动画,在表现上与玩家绕开障碍就一般无异了)

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

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

相关文章

Gartner报告解读:如何帮助企业完善数据分析与治理路线图

Gartner服务于全球100多个国家和地区的14,000余家机构,是一家深受客户信赖、观点客观的研究顾问公司。Garnter洞察、建议和工具可帮助您发现创新机遇,完成关键优先任务,助您成为企业不可或缺的战略专家和价值创造者。该公司是标普 500 指数成…

手把手教在Linux系统服务器下运行HM编码

先在SVN上下载HM文件包,可以看到文件中有linux文件夹,如果在windows下运行直接打开sln后缀的项目。不清楚的看这个: 一、准备工作 1、删除linux文件加下makefile.base中-Werror,文件路径如下: 打开文件,c…

自制深度学习推理框架之表达式层的设计与实现

文章目录 一、表达式Expression二、词法解析2.1 词法定义2.2 词法解析 三、语法解析3.1 语法树的定义3.2 语法树构建3.3 语法树的转换(逆波兰式) 四、表达式层4.1 ExpressionLayer和ExpressionParser类4.2 表达式层的注册4.3 表达式层的输入处理4.4 表达式层的计算过程 五、计算…

插入排序的动画展示与实现

排序学习思路:先实现单趟逻辑,在实现整体逻辑;先解决普遍情况,再解决特殊情况。 什么是插入排序 回忆下自己玩扑克牌的时候是怎么把手上的牌理顺的吧!其实那就是插入排序,从左边往右边,把一张张…

Profinet 从站转 EtherNet/IP 从站网关

产品用途 本产品是 PN(Profinet) 和 EtherNet/IP 网关,使用数据映射方式工作。 本产品在 PN 侧作为 PN IO 从站,接 PN 主站设备,比如西门子 PLC 等;在EtherNet/IP 侧做为 EtherNet/IP 从站,接 EtherNet…

C++:继承用法详解~

在学完C的类和对象,并掌握了类的核心语法与基本用法之后;我们就得去学习一下继承的语法,与继承的用法。简单概括一下,继承是C中一种代码复用的手段,它允许我们,对已有的类,增添新的成员函数或变…

opencv实战项目十六:kmeans图像颜色聚类:

文章目录 前言K-means介绍效果 前言 在数字化时代,图像处理技术已成为计算机视觉领域的重要组成部分。其中,图像颜色聚类作为一项关键技术在众多应用场景中发挥着重要作用,如图像分割、物体识别、色彩调整等。K-means算法作为一种经典的聚类…

【云游戏】点量云流赋能大型游戏新体验

点量小刘发现近期国产化大型3A游戏《黑神话:悟空》的发售,可谓是赢得了一波好评。从场景内容来说深厚的文化底蕴支撑和高质量精美的特效及画面制作令人眼前一亮,作为备受瞩目的一款游戏,从技术层面来说,该游戏也离不开…

【DSP+FPGA】基于DSP+FPGA XC7K325T与TMS320C6678的通用信号处理平台

DSP FPGA 协同处理架构板载 1 个TMS320C6678 多核DSP处理节点板载 1 片 XC7K325T FPGA处理节点板载 1 个FMC 接口板载4路SFP光纤接口FPGA 与 DSP 之间采用高速Rapid IO互联 基于FPGA与DSP协同处理架构的通用高性能实时信号处理平台,该平台采用1片TI的KeyStone系列多…

制造企业如何启用BI工具,并构建自助式BI业务模式?

在制造业的数字化转型浪潮中,商业智能BI工具正逐渐成为推动企业增长的“加速引擎”。随着数据量的爆炸性增长,如何高效地分析和利用数据,已成为制造业提升竞争力的关键。本文将基于BI工具在制造业中的优势,深入探讨一种创新的BI分…

[Meachines] [Insane] Bankrobber XSS-MDOG+SQLI+XSRF+Local-RCE+Bankv2转账模拟应用缓冲区溢出

信息收集 IP AddressOpening Ports10.10.10.154TCP:80,443,445,3306 $ nmap -p- 10.10.10.154 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 80/tcp open http …

jenkins安装k8s插件发布服务

1、安装k8s插件 登录 Jenkins,系统管理→ 插件管理 → 搜索 kubernetes,选择第二个 Kubernetes,点击 安装,安装完成后重启 Jenkins 。 2、对接k8s集群、申请k8s凭据 因为 Jenkins 服务器在 kubernetes 集群之外,所以…

JVM垃圾回收算法:标记-清除算法 、复制算法、 标记-整理算法、 分代收集算法

文章目录 引言I 标记回收算法(Mark-Sweep)算法不足II 复制算法(Copying)III 标记整理算法(Mark-Compact)IV 分代收集(以上三种算法的集合体)内存划分新生代算法:Minor GC老年代算法V 查看JVM堆分配引言 垃圾回收(Garbage Collection,GC) Java支持内存动态分配、…

机器学习/数据分析案例---糖尿病预测

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 这是一篇数据分析/机器学习很好的入门案例,对糖尿病的影响进行预测和分析通过随机森林预测,平均准确率和召回率都不错不足&#x…

Pytorch实现多层LSTM模型,并增加emdedding、Dropout、权重共享等优化

简述 本文是 Pytorch封装简单RNN模型,进行中文训练及文本预测 一文的延申,主要做以下改动: 1.将nn.RNN替换为nn.LSTM,并设置多层LSTM: 既然使用pytorch了,自然不需要手动实现多层,注意nn.RNN…

Threejs之OrbitControls轨道控制器

本文目录 前言一、Orbitcontrols(轨道控制器)1.1 基础使用1.2 代码演示 二、效果展示 前言 Orbitcontrols(轨道控制器)可以使得相机围绕目标进行轨道运动。 一、Orbitcontrols(轨道控制器) 1.1 基础使用 C…

【Python 千题 —— 基础篇】身份证隐藏的信息

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目描述 题目描述 在一个用户信息管理系统中,你需要处理和验证用户提供的身份证号。编写一个程序来从用户信息字符串中提取和验证身份证号,并提供相应的处理方式…

图论----最小生成树讲解与相关题解

目前已更新系列 当前--图论----最小生成树讲解与相关题解 滑动窗口系列算法总结与题解一 算法系列----并查集总结于相关题解 图论---dfs系列 差分与前缀和总结与对应题解(之前笔试真的很爱考) 数论---质数判断、质因子分解、质数筛(埃氏…

在 Cilium CNI 集群上运行 vCluster 虚拟集群

上周在 KubeCon China 2024 大会上,我和社区伙伴们作为志愿者在 Cilium 项目展台与用户交流。有位用户询问 Cilium 是否能与 vCluster 集成,当时未能给出明确答复,特地回来后进行了测试。 答案是:在最新的 vCluster v0.20 中容器…

【Python篇】Python 类和对象:详细讲解(上篇)

文章目录 Python 类和对象:详细讲解1. 什么是类(Class)类的定义 2. 什么是对象(Object)创建对象 3. 属性和方法属性(Attributes)方法(Methods)在类中定义属性和方法使用对…