目录

Three.js-快速入门教程十四使用Stats.js监控渲染帧率和性能优化

Three.js 快速入门教程【十四】使用Stats.js监控渲染帧率和性能优化

https://i-blog.csdnimg.cn/direct/37b4201c4c964dcd93cd4aa94f811465.png

系列文章目录



一、前言

在使用 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 项目中,如果场景复杂导致帧率较低,可能就需要优化场景或硬件来提高这个数值。

https://i-blog.csdnimg.cn/direct/46d88732ab8a47479146af74dfbda5e3.png

  • 1:每帧耗时(MS,Milliseconds per frame):该模式显示渲染每一帧所花费的时间,单位为毫秒。这个指标可以帮助开发者了解渲染的性能瓶颈,因为每帧耗时越短,理论上可以达到的帧率就越高。如果每帧耗时较长,可能需要检查代码中是否有耗时的计算或复杂的图形操作。

https://i-blog.csdnimg.cn/direct/bfcf9b0a28b8471b89731217cf0e81d8.png

  • 2:内存使用情况(MB,Megabytes of memory used):此模式用于监控应用程序的内存使用量,以兆字节(MB)为单位。通过观察内存使用情况,开发者可以发现是否存在内存泄漏或不合理的内存占用,及时优化代码以释放不必要的内存资源。

    https://i-blog.csdnimg.cn/direct/e3edcf9ca61745c1a07ed86d570b1a97.png

也可以通过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;
}

页面元素:

https://i-blog.csdnimg.cn/direct/fe0489f173c845879d6a3de2a2a5bfc2.png

运行效果:

https://i-blog.csdnimg.cn/direct/a49f90058c83434794c95ac27d5d2225.png

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入门知识点请关注该系列教程后续的更新。