将 canvas 的大小增加一个像素会导致 Chrome 中的性能下降

Increasing size of the canvas by one pixel is causing performance regression in Chrome

我的应用多次在 canvas 上绘制相同的图形。我们发现我们可以在隐藏 canvas 上绘制一次,他们只需将它复制到目标 canvas。我正在做一些性能比较。我正面临着一些我无法解释的怪事。

简而言之:我用两个相同大小的 canvases 进行了测试。在第一个 canvas 中,我多次绘制图形。第二个:我先在隐藏的 canvas 上绘制,然后将其复制到可见的 canvas 中。结果应该是一样的。 这是有趣的部分:隐藏 canvas 的方法适用于 canvas 400x164 的大小。比单独绘制每个图形快 60%。 但是一旦我将尺寸增加一次像素到 400x165 - 砰! Chrome 中的冲压速度慢了 60%。在 IE 中它仍然更快(问我如何找到 164-165 阈值)。

以下是 JsPerf 测试的链接:

Chrome 46.0.2490.80 32 位 Windows Server 2008 R2 / 7 64 位

感谢任何帮助。

答案是这样的,不幸的是它很愚蠢。多年来我一直对此感到困惑。你的问题帮助我找到了答案。

当且仅当 canvas 包含 >= 60,000 像素时,才会 Chrome 允许硬件加速。

我在 webgl 应用程序上放置了一个 200x200 的迷你地图。 webgl 应用程序将以 60fps 的速度渲染 150,000 个多边形没有问题。一旦玩家开始移动,帧率就会下降到 ~30fps。禁用小地图将使画面保持在 60fps 的流畅速度。我很惊讶我小小的超级基本迷你地图会造成如此巨大的打击。

在 SO 上搜索解决方案(并没有真正找到解决方案)后,我开始使用发布的 jsfiddles。 Canvas 尺寸似乎决定了一切。在一个特别的fiddle(来自HTML5 drawImage slow on Chrome)中,我尝试了256x256(面积65,536)的大小,运行非常糟糕。尝试了 257x257(66,049 的区域)运行 大约快了 6 倍...

所以我尝试了 257x257 的小地图(使用 CSS 缩放将其缩小到原始大小的外观 运行ce)。 运行 很棒,移动时性能几乎为 0。

就是这样。 Google 选择 60,000 像素的阈值以​​便启动硬件加速。

烦人。

版本 63.0.3239.84(正式版)(64 位)