我有一个经过大量优化的JavaScript应用程序,是一个高度交互式的图形编辑器。现在我开始使用大量数据(图形中的数千个形状)进行分析(使用Chrome开发工具),并遇到了以前不寻常的性能瓶颈,命中测试。
这占据了65%的所有内容(!),是我代码库中的一个巨大瓶颈。我知道这是跟踪指针下的对象的过程,并且我有一些无用的想法可以优化它(使用较少的元素,使用较少的鼠标事件等)。
在开始之前,我想搜索有关优化命中测试的一般原则(那些老套的“废话”博客文章),以及是否存在任何技巧来提高此方面的性能(例如使用
编辑:有这个问题,但它没有多大帮助:What is the Chrome Dev Tools "Hit Test" timeline entry? 所以在完成我的研究后,我很自豪地问:如何优化JavaScript中的本机命中测试?
以下是相关优化的概述:
| Self Time | Total Time | Activity |
|-----------------|-----------------|---------------------|
| 3579 ms (67.5%) | 3579 ms (67.5%) | Rendering |
| 3455 ms (65.2%) | 3455 ms (65.2%) | Hit Test | <- this one
| 78 ms (1.5%) | 78 ms (1.5%) | Update Layer Tree |
| 40 ms (0.8%) | 40 ms (0.8%) | Recalculate Style |
| 1343 ms (25.3%) | 1343 ms (25.3%) | Scripting |
| 378 ms (7.1%) | 378 ms (7.1%) | Painting |
这占据了65%的所有内容(!),是我代码库中的一个巨大瓶颈。我知道这是跟踪指针下的对象的过程,并且我有一些无用的想法可以优化它(使用较少的元素,使用较少的鼠标事件等)。
背景:上面的性能概要显示了我的应用程序中的“屏幕平移”功能,其中屏幕内容可以通过拖动空白区域来移动。这导致许多对象被移动,通过移动它们的容器而不是每个对象单独进行优化。 我制作了一个演示。
在开始之前,我想搜索有关优化命中测试的一般原则(那些老套的“废话”博客文章),以及是否存在任何技巧来提高此方面的性能(例如使用
translate3d
启用GPU处理)。我尝试了查询,如js optimize hit test,但结果充满了图形编程文章和手动实现示例 - 就好像JS社区甚至从未听说过这个东西!即使是Chrome devtools guide也缺乏这个领域。编辑:有这个问题,但它没有多大帮助:What is the Chrome Dev Tools "Hit Test" timeline entry? 所以在完成我的研究后,我很自豪地问:如何优化JavaScript中的本机命中测试?
我准备了一个演示,展示了性能瓶颈,虽然它并不完全与我的实际应用相同,而且数字显然也会因设备而异。要查看瓶颈:
- 在Chrome(或您的浏览器等效物)上转到时间轴选项卡
- 开始录制,然后像疯子一样在演示中移动
- 停止录制并检查结果
以下是相关优化的概述:
- 将单个容器在屏幕上移动,而不是逐个移动数千个元素
- 使用
transform: translate3d
移动容器 - 将鼠标移动与屏幕刷新率同步
- 删除所有可能不必要的"wrapper"和"fixer"元素
- 在形状上使用
pointer-events: none
-- 没有效果
- 瓶颈存在于有或无GPU加速的情况下
- 测试仅在最新版Chrome中进行
- DOM使用ReactJS渲染,但在链接的演示中也可以观察到相同的问题