BabylonJS大场景优化案例

news2024/11/24 7:55:31

在本文中,我们将重点关注用于优化 Babylon.js 港口场景的优化和架构技术。

我们的场景总共有超过 600 个网格和 1,000,000 个顶点。 在我们的 2018 Macbook Pro 上的 Google Chrome 中,它始终以 45+ FPS 的速度运行。 我们发现 Firefox 的帧速率约为 40 FPS,Safari 的帧速率要低得多,但仍可用,为 25 FPS,主要是因为它不支持 WebGL 2.0。

在这里插入图片描述

推荐:用 NSDT设计器 快速搭建可编程3D场景。

这里讨论的优化技术确实涵盖了 Babylon.js,但也侧重于改进我们使用的底层模型、材质和照明的方法,这对性能有巨大影响。 我们所有的模型都是使用 Blender 构建的,因此,此处包含的示例通常引用 Blender 解决方案,但也可以使用任何其他 3D 计算机图形软件。

注意:还有比这里描述的更多的优化技术,有些可能不适用于你自己的环境(例如,我们的一些技术要求我们的模型在场景中是静态的)。 有关推荐技术的更多列表,请查看 Babylon 自己关于此主题的文章。

1、单个模型与多个模型导入

为场景设计资源时需要进行权衡。 以我们的港口为例。
在这里插入图片描述

五月花号数字体验中使用的 3D“港口”模型的鸟瞰图

我们可以在单个 .blend 文件中对整个场景进行建模,并通过单个 .gltf 文件将其传输到 Babylon。 或者,我们可以在独立的 .gltf 文件中设计每个建筑物、船只、树木和岩石,然后在 Babylon.js 脚本中导入和定位资产。

更少的模型和网格意味着 Babylon 渲染循环的循环次数更少。 在 3D 软件中安排场景也更容易,并且可以由不熟练的 JavaScript 程序员的团队成员来完成。 但是,如果你有一个特别大的模型,加载时间可能会很长(就上下文而言,我们的最终 .glb 文件为 8MB)。

或者,我们可以在自己的 .gltf 文件中构建单独的资产(建筑物、树木等),然后导入这些文件并使用 JavaScript 来定位它们。 与自己的 3D 软件相比,这对于设计布局和空间来说不太实用,但由于可以并行加载模型,因此可以缩短加载时间。 它还可以轻松利用 Babylon 自己的实例功能,从而进一步优化树木的放置等。

在 MAS 数字体验中,我们选择了混合方案。 大多数情况下,我们在 Babylon.js 之外即 Blender 中构建的资产。 我们发现让非开发人员编辑场景的自由非常有用,不容牺牲。 我们对加载时间感到满意,因为体验总是预先加载介绍性动画,因此在后台进行的场景加载不太明显。 此外,我们知道我们希望在 Blender 中对场景进行高质量渲染。 在那里构建完整的场景意味着静态渲染可以完美地反映基于浏览器的世界。

2、Babylon.js 性能监控

为了实现优化,我们需要在整个开发过程中意识到我们的表现。 虽然 Babylon.js 有自己出色的调试检查器,但我们发现在开发中有用的最简单的资源是创建我们自己的 FPS 计数器,该计数器始终留在角落里。 Babylon 引擎可以揭示其价值。

在这里插入图片描述

MAS 港口场景视图,显示左上角的小型定制 FPS 计数器
当我们向场景中添加新资源时,当我们做一些有损性能的事情时,情况就变得非常明显。 此外,当有意识地优化我们的场景时,这提供了一个非常易于阅读的改进指标。

不过,执行此操作时请务必与你的场景进行交互。 当相机静止时,场景以 60 FPS 运行,并不意味着它会保持这种状态。 四处走动,点击东西,做你的用户会做的事情!

如果你正在努力找出性能影响发生的地方,我们在检查器中发现了这些非常有用的 Babylon 功能,它们可以帮助你:

2.1 线框和点渲染

在Babylon.js的检查器中,我们可以选择更改渲染模式。 可以通过在场景代码中包含以下行来查看检查器:

scene.debugLayer.show()

从现在显示的菜单中,单击左侧“场景资源管理器”中的“场景”对象。 在右侧的“渲染模式”下,你可以在“点”、“线框”和“实体”之间切换。 我们发现的这些替代视图给出了非常清晰的多边形密度图像。

在这里插入图片描述

Babylon.js 的检查器视图的屏幕截图,其中可以在“点”、“线框”和“实体”渲染模式之间切换
在本例中,我们可以看到,该图像中心的建筑物(代表 IBM 的运营决策管理器)的优化效果仍然不佳,因为考虑到它包含多少条边以及因此包含的多边形。

2.2 显示/隐藏网格和 isEnabled 切换

检查器的另一个最有用的功能是能够打开/关闭场景中的每个网格。 这提供了一种非常简单的方法来监控特定资源对场景性能的影响,这可能与多边形计数无关。

关于如何执行此操作,有两种选择:

  • “场景资源管理器”中任何网格体右侧的“眼睛”图标。
  • Babylon TransformNode 的“IsEnabled”切换。 在场景资源管理器中单击变换节点后,此选项显示在右侧检查器的“常规”选项卡中。

在 Blender 中,我们发现将对象组的父级设置为单个空创建的变换节点。 这些在这里特别有用,因为当导入到 Babylon 时,可以打开/关闭每个节点的“isEnabled”选项,从而一次点击所有子节点,从而使寻找潜在的性能改进变得更加容易。 Blender 集合在导出到 gltf 时丢失。

启用全场景后,我们达到了 48 FPS。

在这里插入图片描述

关闭产品构建后,获得了 1 FPS 的增益

当在与产品相关的建筑物的检查器中关闭“isEnabled”选项时,对 FPS 的影响很小 - 现在为 49 FPS。
在这里插入图片描述

关闭填充建筑物可提高 11 FPS,最高可达 59 FPS
不过,当关闭“填充”建筑物时,我们注意到显着的改进,帧速率跃升至 59/60 FPS。 显然,这些网格是我们需要集中注意力并进一步优化的地方。

3、标准 3D 优化技术

我们应该遵循一些标准的良好实践,这些实践适用于任何实时渲染的场景,无论是 Babylon.js 还是基于浏览器。

3.1 多边形计数

最简单的衡量指标是多边形数量。 渲染 4 个顶点比渲染 4,000,000 个顶点要快得多。 在可能的情况下,巧妙地处理你的模型,只在重要的地方添加细节。 如果你的相机拉得太远以至于你永远看不到它,那么在角色模型上雕刻高清脸部就没有意义了。

Ian Hubert 的 1 分钟“懒惰”Blender 教程是一个很好的例子,说明即使使用超低多边形网格也可以获得多少“细节”。 为 4k 渲染和高预算电影构建高清模型固然很棒,但如果你希望构建基于浏览器的体验,则需要灵活选择模型在何处以及如何呈现细节。

在这里插入图片描述

岩石模型重新拓扑的“之前和之后”视图,取自 SketchFab 的 3D 扫描资产重新拓扑指南
如果你有一个高多边形模型并希望对其进行优化,那么重新拓扑就是你的朋友。 这可能是一个乏味的过程,但性能的改进是显着的。

如果你的建筑物具有门窗等细节,那么你还可以烘焙法线贴图以提供细节外观,而不会减少顶点数。 法线贴图在不牺牲多边形计数的情况下添加高细节方面特别有效。

在这里插入图片描述

左:应用了法线贴图的模型; 中间:没有法线贴图的基础网格; 右:法线贴图

值得注意的是,.gltf 网格具有三角面,因此当你将模型移动到 Babylon 时看到“面数”大幅增加时,请不要感到惊讶。 如果可能,请在导入之前对面进行三角测量,以确保您可以控制多边形和面数。

3.2 实例化

如上所述,渲染 4 个顶点比渲染 4,000,000 个顶点要快。 我们可以“欺骗”渲染器,让其认为我们使用的顶点较少的一种方法是通过实例化。 这减少了 Babylon 在每次渲染中必须执行的绘制调用总数。

在我们完成的港口场景中,我们有 631 个活动网格,以及 73 个绘制调用。 如果没有实例化,我们预计会出现 631 次绘制调用,并且在我们的示例中渲染速度会慢 5-10 倍。

在这里插入图片描述

实例化:Blender 中单个建筑物的突出显示实例

实例是使用硬件加速渲染绘制大量相同网格的绝佳方法(让我们想象一下森林或军队)。 这可以在你选择的 3D 软件中完成(我们使用 Blender,可以使用链接的副本来实现),也可以直接在 Babylon.js中用JavaScript完成(如果你的场景适合从内部定位对象的用例) 。

在场景中多次实例化和重复使用同一模型的一个负面后果是,通常很明显你已经一遍又一遍地冲洗和重复相同的网格。

在这里,我们分享了 Blender 中的一些渲染示例,展示了如何利用实例化,同时保持模型的规模感和可变性。

在这里插入图片描述

左:16 个顶点(带实例); 16k 个顶点(无)— 中间:48 个顶点(有); 48k 个顶点(无)— 右:228 个顶点(有); 228k(无)

在我们的第一张图片中,我们有一个建筑物实例化了 1,000 次。 在第二次渲染中,我们使用建筑物的 3 种材质变体,将其平均分配到 1,000 个实例中。 最后,在第三张图像中,我们修改建筑物,使其不对称,并引入绕垂直轴的随机旋转。 这些微小的变化带来了变化感,同时保持了优化的几何形状。

4、WebGL 的额外考虑 — 材质整合

使用 Babylon 时,文件通常使用 .gltf 格式导入。 但你可能会注意到,当你的模型加载到 Babylon 中时,它已将你的模型拆分为多个单独的对象。

这发生在逐个材质的基础上,意味着在渲染循环中,Babylon 每次都会循环遍历每个新创建的对象,而不仅仅是单个原始网格 - 昂贵!

这里的理想解决方案是使用尽可能少的材质,虽然你可能希望每个对象都具有漂亮的 4K 纹理和 PBR 材质,但如果能够并且它符合你想要的美感,可以使用调色板 。

在这里插入图片描述

左:从 IBM Carbon Palette 创建的多样化调色板。 右:我们用于港口场景的调色板,其中包括渐变段

使用调色板,你可以为所有对象定义单一材质。 将该材质的基础/反照率颜色设置为调色板纹理,并确保模型的 UV 面与你想要的颜色一致。

为此,在 3D 软件中,UV 展开对象,将对象的 UV 缩放至零,然后将 UV 移动到与你希望该面的颜色相匹配的彩色方块中。 如果你使用 Blender,Imphenzia 在他的 10 分钟 Blender 挑战中经常这样做,他在这里详细介绍了这项技术。

每个调色板只需为 3x3 像素(9 种不同颜色)或 8x8 像素(64 种颜色)。 你还可以选择更大的调色板,这样你也可以选择将渐变添加到调色板中。 我们在五月花号体验中将这种技术用于港口的调色板,如上所示。

5、Babylon.js 技巧与技术

如前所述,Babylon 的文档包含丰富的解决内存使用和性能问题的方法。 我们发现两个特别有用的资源是:

  • 优化你的场景:链接
  • 减少内存占用:链接

具体来说,我们在适当的场景和网格导入中使用了以下方法:

5.1 场景:禁用对象交互

如果在你的场景中,不需要直接与 3D 网格交互,那么禁用鼠标事件我们发现非常有效。

scene.pointerMovePredicate = () => false;
scene.pointerDownPredicate = () => false;
scene.pointerUpPredicate = () => false;

我们在《Harbor》和《Challenge 3》场景中使用了这种方法。 鉴于我们需要检测用户点击环境对象(岩石、浮标和船只),我们无法在《Challenge 1》 中使用此功能。

5.2 场景:删除缓存的顶点数据

所有顶点缓冲区都在 CPU 内存上保留其数据的副本,以支持碰撞、拾取、几何编辑或物理。 如果不需要使用这些功能,可以调用此函数来释放相关内存:

scene.clearCachedVertexData();

5.3 网格导入:静态资源

如果你的网格体不会改变位置、旋转或大小,那么通过调用以下命令“冻结”网格体会非常有效:

mesh.freezeWorldMatrix();

即使它们确实发生了变化,但是是间歇性的,那么你可以通过调用以下命令重新打开世界矩阵计算:

mesh.unfreezeWorldMatrix();

5.4 网格导入:无交互

如果不要求用户单击或选取网格体,则可以在导入网格体时添加以下行以进一步增强性能:

mesh.isPickable = false;
mesh.doNotSyncBoundingInfo = true;

5.5 VueJS 和BabylonJS

在我们的项目完成后,我们实际上发现了使用 BabylonJS 和 VueJS 的一个陷阱。 虽然我们对这里的 FPS/性能非常满意,但事实证明,我们通过将 BabylonJS 引擎和场景绑定为 VueJS 中的反应变量而导致了巨大的 FPS 赤字。

我不会在这里讨论太多细节,但在这篇论坛帖子中对此进行了非常详细的介绍。


原文链接:Babylon.js大场景优化实战 — BimAnt

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

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

相关文章

如何设计一个高性能/高并发/高可用/高可靠/可扩展的系统?

作者:阿秀 校招八股文学习网站:https://interviewguide.cn 这是阿秀的第「293」篇原创 小伙伴们大家好,我是阿秀。 面试者和求职者的关系就好像是矛与盾,一个拼命堆自己的防装,反伤刺甲、魔女斗篷都往身上穿&#xff1…

TCP 协议十大相关特性总结

目录 一、TCP特性 二、报文格式 TCP十大核心特性 1. 确认应答 2. 超时重传 3. 连接管理(三次握手,四次挥手) 三次握手 四次挥手 4. 滑动窗口 情况一:接收方的ACK丢失 情况二:发送方的数据包丢失 5. 流量控制 6. 拥塞控制 7. 延迟应答 8. 捎带应答 9. 字节流粘包问题 10. TCP的…

vue3+element-plus点击列表中的图片预览时,图片被表格覆盖

文章目录 问题解决 问题 视觉 点击图片进行预览&#xff0c;但还能继续选中其他的图片进行预览&#xff0c;鼠标放在表格上&#xff0c;那一行表格也会选中&#xff0c;如图所示第一行的效果。 代码 <el-table-column prop"id" label"ID" width"…

花样滑冰选手骨骼点动作识别

2023 CCF BDCI 基于飞桨实现花样滑冰选手骨骼点动作识别 16名方案以及总结 比赛任务 花样滑冰与其他运动项目相比&#xff0c;其动作类型的区分难度更大&#xff0c;这对识别任务来说是极大的挑战。对于花样滑冰动作识别任务&#xff0c;主要难点如下&#xff1a; (1) 花样滑…

10款数据可视化工具,同行公认的好BI

都说内行看门道&#xff0c;一款BI数据可视化工具好不好&#xff0c;同行心里比谁都清楚。那么&#xff0c;能够得到同行一致认可的BI数据可视化工具有哪些&#xff0c;各自又有着怎样的特色优势&#xff1f;接下来就来简单地总结下。 1、Tableau 这是一款普及率很高的数据可…

vscode格式化文档

vscode格式化文档后&#xff0c;换行比较短&#xff0c;看着难受&#xff0c;如下图&#xff1a; 解决方法&#xff1a;在vscode左下角找到设置 并搜索settings.json文件&#xff0c;粘贴如下代码&#xff0c;在格式化文档就会以设置的宽度换行 {// vscode默认启用了根据文…

代码随想录算法训练营day27 | 39. 组合总和,40. 组合总和 II,131. 分割回文串

目录 39. 组合总和 40. 组合总和 II 131. 分割回文串 39. 组合总和 难度&#xff1a;medium 类型&#xff1a;回溯 思路&#xff1a; 这道题的特点是&#xff0c;组合没有元素个数要求&#xff0c;数组无重复元素&#xff0c;每个元素可以无限选取。 组合没有元素个数要求…

linux环形缓冲区kfifo实践1

本次实验使用的kfifo相关宏 struct __kfifo {unsigned int in;unsigned int out;unsigned int mask;unsigned int esize;void *data;}; /** define compatibility "struct kfifo" for dynamic allocated fifos*/ struct kfifo __STRUCT_KFIFO_PTR(unsigned char, …

5.Eclipse的Ctrl+F快捷键搜索面板全功能详解

Eclipse的CtrlF快捷键详解 1.搜索/替换方向 Forward&#xff1a;向前 Backward&#xff1a;向后 2.范围&#xff1a;Scope All&#xff1a;全部&#xff08;当前文件&#xff09; Selected lines&#xff1a;选中的几行 3.选项&#xff1a;Options Case sensiti…

护眼灯作用大吗?2023这样的护眼台灯对孩子眼睛好

可以肯定的是&#xff0c;护眼灯一般可以达到护眼的效果。 看书和写字时&#xff0c;光线应适度&#xff0c;不宜过强或过暗&#xff0c;护眼灯光线较柔和&#xff0c;通常并不刺眼&#xff0c;眼球容易适应&#xff0c;可以防止光线过强或过暗导致的用眼疲劳。如果平时生活中…

嵌入式Linux驱动开发系列六:Makefile

Makefile是什么? gcc hello.c -o hello gcc aa.c bb.c cc.c dd.c ... make工具和Makefile make和Makefile是什么关系&#xff1f; make工具:找出修改过的文件&#xff0c;根据依赖关系&#xff0c;找出受影响的相关文件&#xff0c;最后按照规则单独编译这些文件。 Make…

SpringBoot + Vue 简单前后端分离项目的增删改查

SpringBoot 是提供一种快速整合的方式 文章目录 前期准备新建数据库新建项目config 配置包application.yml 后端业务开发po 类mapper 接口service 接口service 实现类controller 类 测试增加数据测试删除数据测试修改数据测试查新数据测试 前端页面开发查询页面删除功能添加页面…

2023年国内低代码平台盘点:TOP 10活跃领军者,助力企业智能应用快速构建

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

实战实例 | 郑航无人驾驶航空器系统工程专业综合实验平台建设项目

郑州航空工业管理学院 无人驾驶航空器系统工程专业综合实验平台建设项目 关键词&#xff1a;飞控开发、仿真训练、组装调试、无人机集群 解决方案&#xff1a;多智能体协同创新实验室解决方案 | 项目背景 无人机行业是当前发展迅速、技术综合性强和应用前景好的朝阳行业。基…

CCLINK IE FIELD BASIC转MODBUS-TCP网关cclink与以太网的区别

协议的不同&#xff0c;数据读取困难&#xff0c;这是很多生产管理系统的难题。但是现在&#xff0c;捷米JM-CCLKIE-TCP通讯网关&#xff0c;让这个问题变得非常简单。这款通讯网关可以将各种MODBUS-TCP设备接入到CCLINK IE FIELD BASIC网络中&#xff0c;连接到MODBUS-TCP总线…

echo用法、linxu课堂练习题、作业题

一、课堂练习 练习一&#xff1a; 4、普通用户修改密码&#xff1a; root修改密码&#xff1a; 5、修改主机名&#xff1a;hostnamectl hostname 主机名 查看&#xff1a;hostnamectl或者cat etc/hostname 练习二&#xff1a; 1、 mkdir /root/html touch /root/html/index.…

基于摄影测量的数字孪生建设

在这篇博文中&#xff0c;我们将了解如何使用无人机拍摄的照片在数字孪生中创建现实世界环境的 3D 模型。 数字孪生是物理系统的虚拟表示&#xff0c;定期更新数据以模仿其所表示的资产的结构、状态和行为。 数字孪生可以通过在单一管理平台中连接多个数据源并提供可行的见解来…

十一、结合数字孪生与时间技术进行多维分析设计与实施

大数据可视化中心以主题为分析对象,选择业务分类下的某个主题,可以在数据面板中展示其二维图表,在地图中标记其空间分布,并叠加其相应的二维或三维图层。 1、界面设计 其主界面设计详上图,各部分功能介绍如下: 1.1、主题与图层面板,从上到下,从左到右分别是: ①折…

Linux--core dump打开的情况下,运行下面的代码,会发生什么?

代码&#xff1a; #include <iostream> #include <signal.h> #include <unistd.h>using namespace std;void catchSig(int signum) {cout<< "进程捕捉到了一个信号&#xff0c;正在处理中&#xff1a; "<< signum << " p…

基于Spring Boot的招聘网站的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的招聘网站的设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java springboot框…