当canvas具有超过100个元素时,在view.update上滞后

时间:2015-06-01 10:34:21

标签: javascript paperjs

我目前正在使用 Paper.js 开发个人项目,我注意到在使用project.view.update()每次添加后尝试更新视图时,添加超过100个元素会造成巨大延迟

我创建了一个简单的例子来证明这种行为。此示例自动创建200个元素(每10毫秒一个),每个元素有5个随机段。

您可以尝试 here

看看控制台。一开始,一切都很好,但是第100个元素(或多或少)开始变得迟钝。

对于此问题,Paper.js库是否有任何解决方案或改进?这对于绘制应用程序来说是个大问题,需要在用户绘制元素时不断更新。

提前致谢!

PS:我也报告为an issue on Github,但没有人回答我。

PS:我创建了这个 fiddle ,并将最大元素从100更改为2000.如果您看到在200或350个元素后更新计数消息,您会发现问题

1 个答案:

答案 0 :(得分:1)

Paper.js(以及大多数情况下)Canvas包装器库在更改内容时重绘整个场景。换句话说,即使是最微小的变化也会触发全景更新。

重绘周期是所有矢量图形库中固有的,甚至SVG图形都会这样做,但是浏览器会抽象重绘循环(加上其他一些重绘优化)。

所以在每个帧上你基本上都是重绘整个场景。每次重绘都需要在画布上显示100个或更多的矢量项。这是经济放缓的主要原因。

由于每个矢量项都包含段,填充等 - 因此速度会减慢。

1。暂时将项目显示为Raster

你可以通过这样做来解决这个问题:

var tempRaster = myItem.rasterize();
myItem.visible = false; 
  • 我在这里做的是临时光栅化项目。
  • 除了职位以外不能改变任何其他内容的项目 光栅化。
  • 有效地对它们进行光栅化将其转换为单个图像 item,因此在每个渲染周期中渲染速度

我在这里使用item.visible = false;代替item.remove()以保留场景图中的矢量项,以防您想要在某个时刻将其恢复(更改它的属性或使用它作为向量 - 无论你是不是丢失了矢量项本身。)

上述技术类似于Bitmap Caching

如果您打算仅使用线条(如上图所示),这可能没有任何实际好处。当您具有由许多段组成的复杂矢量路径时,这通常是一个很好的解决方案。

2。使用Symbols

如果您的商品与其定位完全相同,您可能还需要查看Using Symbols in Paper.js

3。使用纯HTML5画布绘图命令和沟渠Canvas包装器库

如果您只是在画布上绘制您之后不想操作的形状,只需使用普通的HTML,例如ctx.lineTo(300,150);等。

'定期'没有Vector包装器库(如Paper.js)的Canvas速度要快得多,因为它可以防万一。你只是在画布上画出形状并且全部 - 在绘制之后形状被遗忘,没有涉及重绘循环(除非你自己创建一个)所以一切都要快得多。