Three.js 效能要点

2024-06-14 23:52
文章标签 js 要点 three 效能

本文主要是介绍Three.js 效能要点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

本文在线示例查看。更多精彩内容尽在数字孪生平台,关注公众号:sky的数孪技术,技术交流、源码下载请添加VX:digital_twin123

模型方面:

  • 尽量合并模型,以减少drawcalls
  • 不要合并远距离模型,因为对于远距离模型而言裁剪过滤比合并更有效
  • 次要物体尽量减面,主要物体使用LOD,LOD可以针对整体区域也可以针对单个模型
  • 删除不必要的(如物体内部、看不到的外墙等)面
  • 尽可能合并贴图,多个物体共用UV空间和贴图,多种贴图合并通道
  • 尽量使用预烘焙,比如光照、阴影、光晕效果
  • 面与面之间的距离保持2mm以上,避免zfighting(闪烁)
  • 避免物体放置在视锥体的远平面附近,避免zfighting(闪烁)
  • 使用贴图(比如十字贴图)和简单的平面来模拟复杂形状的模型,比如台阶模拟,餐桌瓶子模拟
  • 尽量复制对象,这样几何体、材质、贴图资源可以共用
  • 避免单个Mesh占据过大的区域,不利于裁剪优化
  • 场景合理布局,尽量避免Mesh过于集中堆放
  • 对于gltf模型,使用blender启用压缩来导出模型或使用命令行压缩工具(如gltf-pipeline)对其进行压缩:gltf-pipeline -i inputModel.gltf -o outputModel.gltf -d
  • 模型分布在原点周围,不要整体偏移在很远的坐标处,尽可能使用实际尺寸,不要用很大(或很小)的缩放

程序方面:

  1. 使用stats插件来监控性能指标

FPS Frames rendered in the last second. 越高越好,不要低于30
MS Milliseconds needed to render a frame. 越低越好
MB MBytes of allocated memory.

  1. 使用http://renderer.info来实现检测drawcalls等数据
console.log("Scene polycount:", renderer.info.render.triangles)
console.log("Active Drawcalls:", renderer.info.render.calls)
console.log("Textures in Memory", renderer.info.memory.textures)
console.log("Geometries in Memory", renderer.info.memory.geometries)
  1. 尽可能复用geometry、material和texture
  2. 避免在render loop中创建任何对象
  3. 避免使用文本格式的模型,使用二进制格式的数据,对于主要用途是web端浏览的应用程序而言,glb是最好的格式,对于要在线编辑模型的应用而言,可以选用fbx
  4. 尽量少使用光源,光照是很消耗渲染性能的,使用预烘培贴图来模拟光照和阴影
  5. 尽量小的FOV和FAR,使用响应式FOV,即对于PC使用较大值,手机使用较小值
  6. 在创建渲染器时选择powerPreference:“高性能”。这可能会使用户系统在多GPU系统中选择高性能GPU
  7. 尽可能的禁用抗锯齿,在使用Retina技术的设备上开启AA的效果不明显,可以禁用掉,比如使用如下代码:
let pixelRatio = window.devicePixelRatio
let AA = true
if (pixelRatio > 1) {AA = false
}this.renderer = new THREE.WebGLRenderer({antialias: AA,powerPreference: "high-performance",
})
  1. 尽量不要动态在场景中添加和删除光源,因为这会导致WebGLRenderer重新编译shader程序,使用:
light.visible = falseorlight.intensiy = 0
  1. 使用光源时,尽量限定范围,比如pointlight的距离,AmbientLight、DirectionalLight和HemisphereLight 是轻量级的。PointLight阴影是昂贵的,因为它需要在6个方向上渲染。
  2. 合理使用材质,尽可能减少物理材质的使用:
MeshPhysicalMaterial : slowest/highest quality
MeshStandardMaterial : near to physical material
MeshPhongMaterial
MeshLambertMaterial : might be removed from future three.js, near to PhongMaterial without specular
MeshBasicMaterial fastest/lowest quality, not affected by lights
MeshBasicMaterial是threejs引擎里的unlit material,尽可能使用unlit material加贴图来模拟视觉效果
  1. 材质尽量使用单面,尽量少用透明材质,因为透明物体性能低下
  2. 尽量减少不必要的循环刷新,使用needsUpdate来控制对象的刷新,比如仅当camera变动、orbitcontrols触发change事件、或者动画播放时,才调用render update:
OrbitControls.addEventListener("change", () => renderer.render(scene, camera));
  1. 对于大规模场景,尽量使用LOD控制,并使用延迟加载(靠近时加载)
  2. 对于大屏,尽量不要应用SSR和屏幕空间的后效处理
  3. 对于大量重复物体,如花草树木,使用实例化对象
  4. 如果多个类似物体按规律排列在空间中,那么选取策略可以合并所有物体然后使用空间坐标寻址,而不必使用射线和每个物体进行选取检测
  5. 和18类似,更普遍的,使用BVH算法来加速光线投射并支持快速的3D空间查询: three-mesh-bvh
  6. 在需要构建碰撞检测的场合,尽可能减少不必要的碰撞体,比如使用octree来构建时,根据场景,采取忽略一定高度以上的物品,忽略尺寸很小的物品等策略
  7. 使用draco压缩解压gltf模型,或者gltfpack,自行测试下具体哪个效果更好
  8. 关闭不必要的阴影效果,对于light castShadow=false, 对于mesh castShadow=false, receiveShadow=false,对于需要的阴影,使阴影截锥体尽可能小,使阴影纹理的分辨率尽可能低
  9. devicePixelRatio很影响性能,有些设备dpi能达到5,程序最好对此做出限制,不要超过3,在牺牲少量清晰度的情况下,能大幅度提升性能
  10. 如果要整体隐藏或显示场景中的部分模型,使用layers来管理这些模型集合
  11. 使用尽量少的贴图,贴图尽量使用jpg而非png,尽可能的压缩以减少尺寸,自行实现足够用的贴图mipmap,而不是由程序生成(可能会多余)

这篇关于Three.js 效能要点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1061859

相关文章

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

EasyPlayer.js网页H5 Web js播放器能力合集

最近遇到一个需求,要求做一款播放器,发现能力上跟EasyPlayer.js基本一致,满足要求: 需求 功性能 分类 需求描述 功能 预览 分屏模式 单分屏(单屏/全屏) 多分屏(2*2) 多分屏(3*3) 多分屏(4*4) 播放控制 播放(单个或全部) 暂停(暂停时展示最后一帧画面) 停止(单个或全部) 声音控制(开关/音量调节) 主辅码流切换 辅助功能 屏

使用JS/Jquery获得父窗口的几个方法(笔记)

<pre name="code" class="javascript">取父窗口的元素方法:$(selector, window.parent.document);那么你取父窗口的父窗口的元素就可以用:$(selector, window.parent.parent.document);如题: $(selector, window.top.document);//获得顶级窗口里面的元素 $(

js异步提交form表单的解决方案

1.定义异步提交表单的方法 (通用方法) /*** 异步提交form表单* @param options {form:form表单元素,success:执行成功后处理函数}* <span style="color:#ff0000;"><strong>@注意 后台接收参数要解码否则中文会导致乱码 如:URLDecoder.decode(param,"UTF-8")</strong></span>

js react 笔记 2

起因, 目的: 记录一些 js, react, css 1. 生成一个随机的 uuid // 需要先安装 crypto 模块const { randomUUID } = require('crypto');const uuid = randomUUID();console.log(uuid); // 输出类似 '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

系统优化要点

这是常用的系统优化要考虑的点,在系统设计和代码评审以及代码优化时加以考虑,最大限度提高系统性能:  1. 优化算法,选择合适高效算法,降低不必要递归,循环,多层循环嵌套,避免循环内初始化等。  2. 避免申请过多不必要的内存  3. 及时释放资源,降低资源使用时间,包括内存,IO,网络,数据库等。  4. 使用缓存:缓存常用的,不易变化的。  5. 慎用数据库锁。确

uuid.js 使用

相关代码 import { NIL } from "uuid";/** 验证UUID* 为空 则返回 false* @param uuid* @returns {boolean}*/export function MyUUIDValidate(uuid: any): boolean {if (typeof uuid === "string" && uuid !== NIL) { //uuid