3D渲染优化入【Three.js】

news2024/9/17 8:18:33

Three.js 应用程序以每秒 60 帧 (FPS) 的速度执行 3D 渲染是流畅和愉快体验的保证。 然而,这是一个有时难以实现的目标!本文整理了优化 Three.js 应用程序和达到 60 FPS 的最佳提示和技巧!
在这里插入图片描述

推荐:使用 NSDT场景编辑器 快速搭建 3D场景。

1、监测性能

在开始优化Three.js应用之前,我们必须能够衡量应用程序的性能。 我建议你使用 Three.js的 stat模块,它允许在我们的页面上添加性能监视器:
在这里插入图片描述

2、选择网络浏览器

如你所知, Three.js 应用程序是用 JavaScript(一种解释型语言)编写的。 因此,我们的代码将直接由浏览器的 JavaScript 引擎执行。

市场上存在许多网络浏览器; 因此,我们代码的执行速度与执行它的网络浏览器密切相关!
在这里插入图片描述

谷歌浏览器以在 WebGL 和 Three.js 上表现出色而著称。 这就是为什么同时测试多个浏览器很重要,这样才能保证全局优化水平令人满意。

具有最新更新的浏览器通常也具有最佳性能。

3、减少场景中的多边形数量

第一种优化方法涉及场景中多边形的数量。

在每次执行 3D 渲染期间,处理器负责显示场景中的对象。 要处理的多边形(3D 对象结构的面)越多,工作量就越大。

可以使用这行代码简单地显示渲染引擎当前处理的多边形数量:

console.log("Number of Triangles :", renderer.info.render.triangles);

在这里插入图片描述

因此,增强应用程序性能的一个好方法是降低场景的复杂性。 为此,我们有两种方法:

  • 从场景中移除 3D 对象
  • 通过减少多边形数量来简化 3D 对象

在第一种情况下,我们必须简单地分类并从场景中删除某些 3D 对象。

在第二种情况下,工作更细微。 在3D 建模软件的帮助下,我们将简化模型并删除尽可能多的面。 例如,可以删除所有隐藏的和相机不可见的面。

某些软件(例如 Blender)提供自动简化 3D 结构的功能!

4、停用抗锯齿

在渲染引擎中停用抗锯齿是一种简单的方法,可以显着提高我们的应用程序的性能,以换取一些可见像素。

实际上,抗锯齿用于平滑 3D 对象的轮廓并在最终渲染中提供更整洁的效果—非常高效,但会增加处理器的工作量!
在这里插入图片描述

使用 3D 渲染引擎的属性来激活或停用抗锯齿:

//Enabled
renderer = new THREE.WebGLRenderer( { antialias : true } );

//---------------------

//Disabled
renderer = new THREE.WebGLRenderer( { antialias : false } );

停用抗锯齿是优化 Three.js 应用程序性能的一种简单有效的方法!

5、降低 3D 渲染的分辨率

在 3D 渲染期间降低分辨率(计算像素的数量)是另一种轻松优化我们的 Three.js 应用程序的方法。

这种方法非常有效,但图形质量损失很大。 因此,我建议你将此方法用作最后的手段!

为了降低分辨率,我们将使用 3D 渲染引擎的 setPixelRatio 方法。

//Base value
renderer.setPixelRatio( window.devicePixelRatio );

通过修改像素比,可以减少计算像素的数量,从而修改最终分辨率!

因此,让我们将 3D 渲染的分辨率修改为 0.5:

//Lower résolution
renderer.setPixelRatio( window.devicePixelRatio * 0.5 );

你可能已经注意到,FPS 的提升令人印象深刻(从 24 FPS 到 60 FPS),但图形质量却大大降低了。


原文链接:Three.js渲染优化 — BimAnt

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

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

相关文章

Day13【元宇宙的实践构想02】—— 元宇宙与沉浸式交互技术介绍、支撑开发与应用

💃🏼 本人简介:男 👶🏼 年龄:18 ✍今日内容:《元宇宙的实践构想》02——元宇宙与沉浸式交互技术 🚩 今日留言:亮亮被迫去练科目二啦,定时发布的文章&#xff…

鉴源论坛 · 观通丨联锁系统原理浅析

作者 |刘艳青 上海控安安全测评中心安全测评部测试经理 版块 | 鉴源论坛 观通 01 联锁系统的硬件结构 根据联锁系统的层级关系,联锁系统的硬件层级可以分为4层:人机会话层、联锁层、接口层、室外设备层。 图1 联锁系统的硬件结构 02 联锁系统的软件结…

误删照片音视频文件不要担心 几种方法解救慌乱的你

误删照片音视频文件不要担心 几种方法解救慌乱的你 推荐的几款软件涵盖了大量的恢复方式,手机如果刷机或者损坏找回的几率会越低 免费软件获取方式关注公众号回复8585 更多软件获取方式点我 方法1:从手机相册中恢复手机删除的照片 这里以vivo手机为例,其他手机也是差…

C/C++ Linux Socket网络编程

之前已经学习了QT的socket编程 和 C/C在window环境的socket编程,现在再来学习一波C/C在Linux环境下的socket编程,为以后学习C Linux 服务器开发做准备。 目录 一、Socket简介 二、Socket编程基础 1. 网络字节序 2. sockaddr数据结构 3. IP地址转换函数…

新C++(5):异常

"山,请你慢些走向我呀~"一、异常初始每当我们使用传统C写一些诸如malloc\realloc,或者不允许传入的参数为空(nullptr)时,我们时长会加一个断言(assert),一旦条件为false立即终止程序,不仅如此,当申请的空间够大&#xf…

二叉树:二叉树的最近公共祖先

二叉树的最近公共祖先 文章目录一、题目描述二、解题思路三、代码解析一、题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x&#xff0c…

Vue实现下载文件而非浏览器直接打开

问题背景 对于一个txt文本、图片、视频、音频等浏览器可以直接使用浏览器进行预览的文件, 使用传统的a标签加download属性进行下载是行不通的,会在浏览器直接打开,因此需要搞一个新的方式进行下载。 实现流程 实现思路 这里使用Vue自定义…

ElasticSearch从入门到出门【中】

文章目录DSL查询文档DSL查询分类全文检索查询使用场景基本语法示例精准查询term查询range查询地理坐标查询矩形范围查询附近查询复合查询相关性算分算分函数查询布尔查询搜索结果处理排序普通字段排序地理坐标排序分页基本的分页深度分页问题高亮高亮原理实现高亮RestClient查询…

档案数据智能采集工厂模型设计与实现

档案信息化从业人员肯定对异构系统数据采集过程中碰到的各种问题深有体会,有源系统供应商不配合的;数据接口不开放的;归档数据不符合规范的;数据敏感不提供的;等等;不一而足。但不幸的是档案信息系统处于政…

C 语言零基础入门教程(二十二)

C 错误处理 C 语言不提供对错误处理的直接支持,但是作为一种系统编程语言,它以返回值的形式允许您访问底层数据。在发生错误时,大多数的 C 或 UNIX 函数调用返回 1 或 NULL,同时会设置一个错误代码 errno,该错误代码是…

VS2017编译c dll的方法-编译bsio

VS2017编译c dll 有三种方法 (1).h和.c文件函数增加 __declspec(dllexport) (2)仅在.h函数添加__declspec(dllexport) (3)使用.def文件,不用在.h和.c文件的函数前增加__declspec(dllexport) …

【数据结构初阶】顺序表的实现(文末附原码)

⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏留言 ⭐系列专栏:数据结构初阶 ⭐代码仓库:Data Structure 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注&#xff…

基于C讲解协程设计原理

协程设计原理 背景 以epoll处理fd为例: func () {while (1) {epoll_wait();for(;;) {recv();send();}} }在IO操作较为密集的情况下(网络IO和磁盘IO操作多,CPU计算少),由于检测到IO事件后,需要进行同步的…

美颜sdk动态贴纸是什么?

美颜sdk如今已经成了广大视频拍摄平台的刚需,用户们也习惯了这种新颖的拍摄形式,原相机被无情“打入冷宫”,特别是短视频和直播平台中,绝大部分用户都在使用美颜sdk的趣味功能进行拍摄,“动态贴纸”就是一个非常好的例…

什么是PEPPOL BIS?

和常见的X12以及EDIFACT类似,PEPPOL BIS也是一种EDI标准,主要用于B2G和B2B交易,在欧盟的应用十分广泛。在业务场景中,PEPPOL不单单只是用于发票,从下单到开票流程中均可提供标准化的数据传输。 在此前的文章中&#x…

[Ansible系列]ansible tag介绍

简介 在大型项目当中,通常一个playbook会有非常多的task。而我们每次执行这个playbook时,都会将 所有task运行一遍。而事实上,在实际使用过程中,我们可能只是想要执行其中的一部分任务而已, 并不想把整个playbook完整跑…

【单链表】数据结构单链表的实现

前言:在之前的学习中我们已经了解了顺序表的相关知识内容,但是顺序表我们通过思考可以想到如下问题: 中间/头部的插入删除,时间复杂度为O(N)增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。增容…

性能技术分享|Jmeter+InfluxDB+Grafana搭建性能平台

一、引言最近在公司做性能技术分享时,发现同事对环境搭建能力,还是有些欠缺。或许,这也是大部分性能测试工程师所欠缺的技能。因为绝大部分的性能测试工程师,要么是使用测试开发架构师搭建的性能平台,要么自己使用Jmet…

【Unity3D】激光灯、碰撞特效

1 需求描述 本文将模拟激光灯(或碰撞)特效,详细需求如下: 从鼠标位置发射屏幕射线,检测是否与物体发生碰撞当与物体发生碰撞时,在物体表面覆盖一层激光灯(或碰撞)特效本文代码见→激…

振弦采集模块VMTool 配置工具的传感器数据读取

振弦采集模块VMTool 配置工具的传感器数据读取 连接传感器 将振弦传感器两根线圈引线分别连接到 VM 模块模块的 SEN和 SEN-两个管脚。 通常不分正负极,任意连接即可。 连接模块电源 使用 5V~12V 直流电源连接到 VM 模块的 VIN 和 GND,电源正极连接到 VIN…