【发布时间】:2015-08-08 20:46:06
【问题描述】:
我正在使用 drawRect 在 HTML5 画布上绘制大量(约 20000 个)矩形,每个矩形都位于不同的预定位置。我是从一个循环中做到这一点的:
for (var i = 0; i < 100; ++i) {
for (var j = 0; j < 200; ++j) {
context.fillStyle = '#000000';
context.fillRect(i * 8, j * 2, 6, 1);
}
}
这个 sn-p 在 800 像素宽的画布中绘制 100 个条形图,每个条形图宽度为 6 像素,每个条形图由多个相互堆叠的小 (1x6) 矩形组成:在提供的示例中静态计数为 200 ,但我的应用程序中的计数是动态变化的(因此需要重新渲染它们)。
这需要几十毫秒,本身并不严重。但是整个过程被重复调用,这显着影响了性能,而且效果不佳。
是否有解决方案或变通方法可以在一个画布指令中绘制这样的条,希望更好地利用硬件加速?
每个矩形在我的应用程序中都会发光,因此水平切割它们不是一个好方法。我已经尝试过使用离屏画布,在那里绘制,并将其图像输出渲染到主画布,但没有明显的性能提升。
【问题讨论】:
-
您是否尝试过为下一次迭代保留屏幕外画布?如果内容是“静态的”,为什么还要不断重绘呢?
-
@Amit 条形高度根据输入数据而变化,因此需要重新渲染。我想我会把它编辑成问题。
-
好的...那么您至少可以将 1 个条复制到其余条吗? (可能以“二进制增量” 1 - 2 - 4 - 8... 方式?)
-
@Amit 这在理论上是可能的,但在实践中似乎非常不可行。用于绘制条形的输入数据是来自Web Audio API Analyser node 的字节频率数据。
-
相反方法:在静态图像/屏幕外画布中放置完整条,将其复制到目标画布,然后
ctx.clearRect不需要的区域。这样可以吗?
标签: javascript canvas