使用EaselJS vs Canvas原生方法时,我遇到了一个巨大的性能问题:2.2 s vs 0.01 s(尽管EaselJS确实映射了canvas原生方法...)。

我写了一个画树的画布应用程序*。为了使树的生长具有动画效果,在EaselJS图形对象之间进行补间似乎比编写自定义绘制函数更清洁,更方便。
*(实际上,它看起来更像是弗吉尼亚爬山虎)

1)我一定做错了,因为EaselJS的性能非常糟糕。

代码的重要部分:

var g=new createjs.Graphics();
g.bs(branchTexture);
for (var i=0; i < arbre.length; i++) {
    var step=arbre[i];
    for (var t=0; t < step.length; t++){
        var d=step[t];
        var c=d[5];
        var s=new createjs.Shape(g);
        s.graphics.setStrokeStyle(7*(Math.pow(.65,d[7]-1)),'round').mt(c[0],c[1]).qt(c[2],c[3],c[4],c[5]);
        }
        mainStage.addChild(s);
    }
}
mainStage.update();


这是一个显示比较的jsfiddle:
http://jsfiddle.net/xxsL683x/29/

我尝试删除纹理,简化了moveTo()操作,但是结果仍然很慢。缓存不适用,因为它是第一次渲染。
我做错了什么?

2)另外,我需要找到一种方法来使填充图案沿生长方向定向,所以我认为我将摆脱矢量形状,并在两个“生长状态”之间插入一些位图。如果有人有更好的主意,我将很高兴阅读。

(但是,最好回答第一个问题,这可能不是我最后一次尝试对复杂对象进行补间了。)

3)摆脱EaselJS的另一个原因是抗锯齿不适用。为什么呢还必须调查...

希望这个问题能够帮助其他人避免一些错误(如果我做了一些错误),或者至少可以更好地理解easyljs处理矢量形状的方式。

PS:树上确实有叶子;)...但是出于明显的原因,我把它们拔了出来。

最佳答案

我已经更新了您的小提琴,现在速度更快了。问题是您要在每个循环中创建一个新的Shape,这很慢。

 for (var t=0; t < step.length; t++){
    // loop
    g.setStrokeStyle(7*(Math.pow(.65,d[7]-1)),'round').mt(c[0],c[1]).qt(c[2],c[3],c[4],c[5]);
  }

  // then just create a Shape after all your graphic commands are built
  var s = new createjs.Shape(g);
  mainStage.addChild(s);


http://jsfiddle.net/xxsL683x/31/

关于javascript - 具有200多种矢量形状的EaselJS:性能和美学,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28215208/

10-11 13:22