系列文章目录
Three.js 快速入门教程【一】开启你的 3D Web 开发之旅
Three.js 快速入门教程【二】透视投影相机
Three.js 快速入门教程【三】渲染器
Three.js 快速入门教程【四】三维坐标系
Three.js 快速入门教程【五】动画渲染循环
Three.js 快速入门教程【六】相机控件 OrbitControls
Three.js 快速入门教程【七】常见几何体类型
Three.js 快速入门教程【八】常见材质类型
Three.js 快速入门教程【九】光源类型
Three.js 快速入门教程【十】常见的纹理类型
Three.js 快速入门教程【十一】天空盒的多种实现方式
Three.js 快速入门教程【十二】外部模型加载
Three.js 快速入门教程【十三】外部模型加载后常见的处理操作
Three.js 快速入门教程【十四】使用Stats.js监控渲染帧率和性能优化
Three.js 快速入门教程【十五】交互神器DragControls使用详解,实现对物体或模型拖拽
Three.js 快速入门教程【十六】调试神器 gui.js使用详解,可视化面板控制场景参数提高开发效率
Three.js 快速入门教程【十七】射线拾取模型——射线与射线投射器Raycaster介绍
Three.js 快速入门教程【十八】射线拾取模型——鼠标点击屏幕选中模型或物体
Three.js 快速入门教程【十九】CSS2D渲染器介绍,实现场景中物体或设备标注标签信息
Three.js 快速入门教程【二十】三维模型优化实战:使用gltf-pipeline与Draco对模型进行压缩,提高加载速度和流畅性
Three.js 快速入门教程【二十一】CSS3D渲染器(CSS3DRenderer、CSS3DObject 、CSS3DSprite)介绍,实现场景中物体标注标签信息
Three.js 快速入门教程【二十二】动画神器Tween.js使用指南
文章目录
一、前言
在使用 Three.js 进行 3D 图形开发时,了解场景的渲染性能,特别是渲染帧率(FPS),对于优化和调试应用程序至关重要。Stats.js 是一个轻量级的 JavaScript 库,用于实时监控和显示应用程序的性能指标,其中就包括渲染帧率。在本篇教程中,我们将学习如何在 Three.js 项目中集成 Stats.js 来查看渲染帧率。
二、认识渲染帧率
在 Three.js 里,通常使用 requestAnimationFrame 函数来创建渲染循环,在这个渲染循环中,每次调用 renderer.render()函数就获取一帧的canvas图像,不断调用就形成连续动画并更新到canvas, 而帧率就是指浏览器每秒能够成功渲染并展示的动画帧数,也即每秒调用renderer.render()函数次数。
三、为什么需要关注渲染帧率?
在Three.js开发过程中,帧率(FPS)是衡量应用性能的核心指标。60 FPS意味着每秒渲染60帧,这是流畅动画的黄金标准。当帧率低于30 FPS时,用户会明显感受到卡顿。通过实时监控帧率,我们可以:
-
快速定位性能瓶颈
-
优化渲染性能
-
确保跨设备兼容性
-
提升用户体验
四、Stats.js 的引入与集成
4.1 初始化
//引入性能监视器stats.js
import Stats from 'three/addons/libs/stats.module.js';
const stats = new Stats();
//显示模式
stats.showPanel(0); // 0: fps, 1: ms, 2: mb,
4.2 集成到 Three.js 渲染循环
// 主渲染循环
function animate() {
requestAnimationFrame(animate);
// 执行渲染
renderer.render(scene, camera);
// 更新 Stats
stats.update();
}
animate();
通过在每次渲染后调用 stats.update(),Stats.js 会计算并更新当前的渲染帧率等性能指标,并在页面上显示出来
面板支持三种模式由stats.showPanel()入参决定:
- 0:帧率(FPS,Frames Per Second):此模式下,Stats.js 会显示当前应用程序的渲染帧率,即每秒渲染的帧数。较高的帧率通常意味着更流畅的动画和交互体验。例如在 Three.js 项目中,如果场景复杂导致帧率较低,可能就需要优化场景或硬件来提高这个数值。
- 1:每帧耗时(MS,Milliseconds per frame):该模式显示渲染每一帧所花费的时间,单位为毫秒。这个指标可以帮助开发者了解渲染的性能瓶颈,因为每帧耗时越短,理论上可以达到的帧率就越高。如果每帧耗时较长,可能需要检查代码中是否有耗时的计算或复杂的图形操作。
- 2:内存使用情况(MB,Megabytes of memory used):此模式用于监控应用程序的内存使用量,以兆字节(MB)为单位。通过观察内存使用情况,开发者可以发现是否存在内存泄漏或不合理的内存占用,及时优化代码以释放不必要的内存资源。
也可以通过setMode动态切换模式
stats.setMode(0);//显示帧率
五、实战配置详解
5.1 自定义显示位置
const stats = new Stats();
stats.showPanel(0); // 0: fps, 1: ms, 2: mb, 3+: custom
//为面板添加class=stats
stats.dom.classList.add('stats')
document.body.appendChild(stats.dom);
css改变面板位置为右上角:
.stats {
position: fixed!important;
top: 20px!important;
left:auto!important;
right: 20px!important;
z-index: 1000;
}
页面元素:
运行效果:
5.2 动态调整渲染频率,优化性能
function adaptiveRender() {
if (stats.getFPS() < 50) {
//当帧率小于50,关闭渲染器自动清除功能,提高性能
renderer.autoClear = false;
// 其他优化措施
} else {
renderer.autoClear = true;
}
}
renderer.autoClear 是 WebGLRenderer 的一个属性,它用于控制在每次渲染之前是否自动清除画布的颜色缓冲区、深度缓冲区和模板缓冲区,当连续多次渲染不需要清除画布时(如分阶段渲染),关闭自动清除可减少 GPU ,优化性能
5.3 性能快照对比
let baseMemory;
function startProfile() {
baseMemory = stats.current().memory;
}
function endProfile() {
const diff = stats.current().memory - baseMemory;
console.log(`内存变化:${diff} MB`);
}
5.4 自动化性能报告
setInterval(() => {
const report = {
fps: stats.current().fps,
frameTime: stats.current().ms,
memory: stats.current().memory
};
analytics.send(report); // 发送到监控平台
}, 10000);
五、总结
通过以上介绍,我们掌握了在 Three.js 项目中集成了 Stats.js 来实时监控和显示渲染帧率。这对于优化 Three.js 应用程序的性能非常有帮助。你可以根据实际需求调整 Stats.js 的显示面板类型,查看更多性能指标,然后根据指标进行渲染优化。
更多three.js入门知识点请关注该系列教程后续的更新。