开放大世界的碰撞与物理

news2024/11/13 10:21:19

        众所周知,物理开销一直是 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.coloradmin.cn/o/2083673.html

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

相关文章

《“草莓”引领风潮:全能AI与专业型AI的未来市场较量》

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Vmware下安装Rocky Linux9.4

Rocky Linux简介 Rocky Linux是一个开源、社区拥有和管理、免费的企业Linux发行版,提供强大的生产级平台。可作为CentOS停止维护后的替代方案。 下载Rocky Linux 下载地址 Download - Rocky Linux 根据电脑实际情况选择对应版本的Linux,这里下载AMD/In…

springboot在线办公小程序论文源码调试讲解

第二章 技术介绍 2.1 B/S结构 随着软件系统的不断改进和升级,B/S结构产品更为方便的特征体现地十分明显。对于一个中等偏大的公司来说,如果系统管理员每天要在很多台电脑之间来回查看,不断奔走,那么效率和工作量就会变得很低&…

HSE软件组件有哪些?如何实现HSE与主机的通信(同步/异步)?如何使用HSE提供的安全服务?

《S32G3系列芯片——Boot详解》系列——HSE软件组件有哪些?如何实现HSE与主机的通信(同步/异步)?如何使用HSE提供的安全服务? 一、HSE子系统软件组件1.1 NXP交付用户的HSE固件内容1.2 HSE固件提供的安全服务1.3 HSE固件…

代码随想录刷题day15丨110.平衡二叉树,257. 二叉树的所有路径, 404.左叶子之和 ,222.完全二叉树的节点个数

代码随想录刷题day15丨110.平衡二叉树,257. 二叉树的所有路径, 404.左叶子之和 ,222.完全二叉树的节点个数 1.题目 1.1平衡二叉树(优先掌握递归) 题目链接:110. 平衡二叉树 - 力扣(LeetCode&a…

探索数字沙龙——文本描述生成数字人3D发型的专业工具

一、引言 随着数字媒体创作领域不断发展,创作者们对于细节和真实感的要求越来越高。特别是在头发造型这一方面,如何准确地捕捉到人物的个性和情感,成为了3D建模和动画制作中的重要环节。为此,我们介绍了一款名为“数字沙龙”的3D头发造型工具,它旨在为数字媒体创作者提供…

分类预测|基于灰狼GWO优化BP神经网络的数据分类预测Matlab程序GWO-BP|基于鲸鱼WOA优化BP神经网络的数据分类预测Matlab程序WOA-BP

分类预测|基于灰狼GWO优化BP神经网络的数据分类预测Matlab程序GWO-BP|基于鲸鱼WOA优化BP神经网络的数据分类预测Matlab程序WOA-BP 文章目录 前言分类预测|基于灰狼GWO优化BP神经网络的数据分类预测Matlab程序GWO-BP|基于鲸鱼WOA优化BP神经网络的数据分类预测Matlab程序WOA-BP 一…

系统编程-多线程1

多线程1 目录 多线程1 引入 认识线程 1、线程的概念 2、线程的优缺点 3、进程和线程的区别和联系 4、什么时候选进程,什么时候选线程? 线程相关函数 1、创建线程 2、线程的退出函数 3、阻塞等待线程退出 并回收资源 4、获取自身线程号的函数…

算法设计:实验一分治与递归

【实验目的】 深入理解分治法的算法思想,应用分治法解决实际的算法问题。 【实验内容与要求】 设有n2k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表: 1.每个选手必须与其他n-1个选手各赛一次;2.每个选手一天只能赛一…

[Algorithm][综合训练][消减整数][最长上升子序列(二)][春游]详细讲解

目录 1.消减整数1.题目链接2.算法原理详解 && 代码实现 2.最长上升子序列(二)1.题目链接2.算法原理详解 && 代码实现 3.春游1.题目链接2.算法原理详解 && 代码实现 1.消减整数 1.题目链接 消减整数 2.算法原理详解 && 代码实现 解法&#x…

【Linux】POSIX版本 信号量

目录 信号量的基本操作 基于信号量和环形队列的生产消费模型 之前我们在System V版本的进程间通信说过信号量,这里我们说的是POSIX(Portable Operating System Interface for uniX 可移植操作系统接口)版本的并且会说的更加详细 我们之前对…

论文3解析(复现):六自由度机械臂轨迹规划研究-部分2

论文:六自由度机械臂轨迹规划研究,马强 上一篇,介绍了一些基础知识,那么接下来是这篇论文的核心部分,轨迹规划的事。 一般来说,轨迹规划有2种,一种是对于笛卡尔坐标系,一种是对于关…

nginx反向代理,负载均衡,动静分离

反向代理,负载均衡 nginx通常被用作后端服务器的反向代理,这样就可以很方便的实现动静分离以及负载均衡,从而大大提高服务器的处理能力。 nginx实现动静分离,其实就是在反向代理的时候,如果是静态资源,就…

Open3D mesh 去除噪点

目录 一、概述 1.1去除噪点的方法 1.2应用 二、代码实现 三、实现效果 3.1原始点云 3.2添加噪声的mesh Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概述 在三维网格…

在 H100 GPU 上使用 Hugging Face Quanto 优化 AI 模型

基于 Transformer 的扩散模型日益完善,已被证明能够彻底改变文本到图像的生成方式。Transformer 的功能不仅能增强模型的可扩展性和性能,还会增加模型的复杂性。 在这种情况下,模型的复杂性越高,功耗和内存消耗也就越大。 例如&am…

《JavaEE进阶》----3.<SpringBoot项目创建细节大全+打jar包运行>

本篇博客讲解了 创建Spring Boot项目的各种方法及创建细节、还有项目中目录和代码的简单介绍、启动项目、换端口号、Web服务器简介、HTTP状态码、以及用Maven打jar包运行。 什么是Spring Spring让开发Java工程项目变得更快、更简单、更安全。 它专注于开发工程时的速度、简化…

Python在神经网络中优化激活函数选择使用详解

概要 在神经网络中,激活函数扮演着至关重要的角色。它的主要作用是引入非线性因素,使得神经网络能够处理复杂的非线性问题。如果没有激活函数,神经网络仅仅是线性模型的堆叠,无法胜任深度学习中的各种任务。本文将深入探讨几种常用的激活函数,包括Sigmoid、Tanh、ReLU及其…

【JVM】垃圾收集器与GC日志(二)

垃圾收集器与GC日志 ZGC收集器(Z Garbage Collector,全并发、超低延迟 10ms) ZGC是一款JDK11中新加入的具有实验性质的低延迟垃圾收集器,ZGC可以说源自于Azul System公司开发的C4(Concurrent Continuously Compacting Collector)收集器 参考文章:http…

5G 4G 空口信令APN携带差异

4G 终端在PDN connectivity request中access_pt_name中携带。 msg_type 208 (0xd0) (PDN connectivity request) lte_esm_msgpdn_connectivity_reqpdn_type 3 (0x3) (Ipv4v6)req_type 1 (0x1) (initial request)info_trans_flag_incl 0 (0x0)access_pt_name_incl 1 (0x1…

基于vue框架的财务室发票管理系统设计与实现946m1(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:财务,发票数据 开题报告内容 基于Vue框架的财务室发票管理系统设计与实现开题报告 一、开题报告名称 基于Vue框架的财务室发票管理系统设计与实现 二、研究背景与意义 在现代企业财务管理中,发票管理是一项至关重要的工…