【发布时间】:2014-02-18 07:54:36
【问题描述】:
我发现 HTML5 画布有一个奇怪的现象。我的帧速率低于预期,但仅在 Firefox 中,并且仅在一台计算机上(但不是在我测试的另一台计算机上)。奇怪的是,如果我将画布尺寸减小到 255x250 或更小,Firefox 的性能与其他浏览器相似。如果我在宽度上再增加一个像素,FPS 会迅速下降到三分之一。
我制作了一个 jsPerf 来演示这个问题:http://jsperf.com/critical-canvas-size (确保灰色矩形在屏幕上。如果没有,我会让测试失败,因为我发现如果你不小心滚动离开它会改变结果。)
所有四个测试用例都与大多数系统上的大多数浏览器非常相似,但在这台装有 Firefox 17 的 PC 上,我看到以下内容:
有问题的 PC 运行的是旧版 Red Hat Linux,我猜它可能没有硬件加速支持(从操作系统方面)。
那么,这可能是什么原因?我可以在我的代码中做些什么来规避这个问题吗? (例如,我一直在考虑使用几张小画布而不是一张大画布。)
编辑: 这是一个独立的 html 文件 that exibits the problem 和 one that doesn't。唯一的区别是画布的宽度,251 vs. 250。(你可以注释掉微调器动画,这只是为了让问题可见。另外请原谅FPS计时器的准确性,它的实现很简单。)
250px 的版本大约 60 FPS,实际上它似乎有上限。您可以增加numIterations 变量以使框架函数绘制多个图块。我可以达到 numIterations = 100 或 120000 块/秒,同时仍然具有不错的帧速率。但是,即使 numIterations = 1,251px 版本也能提供低于 20 或低于 1000 块/秒的帧速率。
【问题讨论】:
-
我不确定您的结果是否与画布的大小直接相关。
-
还能是什么?画布大小是我唯一改变的东西。我尝试了许多不同的尺寸。低于 255x250(或 300x212)它是平滑的,在宽度或高度上增加一个像素,帧率下降到三分之一。在这两种情况下,我肯定会绘制相同数量的像素。
-
您的测试假设
requestAnimationFrame将始终以一致的时间间隔解决,这根本不正确。虽然这可能是 FF 构建的问题,但我认为不能完全依赖测试。例如,我在每个不同的测试中得到 +/- 10 fps 的差异,没有明显的原因(Chrome 24、Win 7)。我建议更多地运行测试,可能会更改测试运行的顺序,然后您可能能够确定一些相关性。 -
问题不在于jsperf!问题出现在一个独立的 HTML 文件中,即我正在绘制的动画变得超级抖动。我刚刚制作了 jsperf 来尝试演示它。 (不?)幸运的是,这个问题似乎只发生在某些系统上。 (顺便说一句,该测试测量从 requestAnimationFrame 调用到回调完成的平均时间,我通常会在其中发出另一个调用。这是我感兴趣的实际数字,因为它限制了最大帧速率。)跨度>
-
jsPerf使用的动画和你的问题代码中的动画一样吗?
标签: firefox html5-canvas