具有 200 多个矢量形状的 EaselJS:性能和美学
EaselJS with 200+ vector shapes : performance and aesthetics
我在使用 EaselJS 时遇到了一个巨大的性能问题 vs Canvas 本机方法:2.2 秒 vs 0.01 秒(尽管 EaselJS 会映射 canvas本机方法...)。
我写了一个 canvas 应用程序来画一棵树*。为了动画树的生长,补间 EaselJS graphics 对象似乎比编写自定义绘图函数更干净、更方便。
*(实际上它看起来更像弗吉尼亚苦力怕)
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) 此外,我需要找到一种方法将填充图案定向到生长方向,所以我想我会摆脱矢量形状并在两个 "growth states" 之间插入一些位图.如果有人有更好的主意,我很乐意阅读它。
(不过,如果能回答第一个问题就好了,这可能不是我最后一次尝试对复杂对象进行补间。)
3) 摆脱 EaselJS 的另一个原因是抗锯齿功能不适用。为什么 ?也得调查一下...
希望这个问题能帮助其他人避免一些错误,如果我已经做了一些错误,或者至少会导致更好地理解 easeljs 处理矢量形状的方式。
PS : 这棵树确实有叶子 ;)...但是为了清楚起见,我把它们拔掉了。
我已经更新了您的 Fiddle,现在速度快多了。问题是您在每个循环中创建一个新的 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);
我在使用 EaselJS 时遇到了一个巨大的性能问题 vs Canvas 本机方法:2.2 秒 vs 0.01 秒(尽管 EaselJS 会映射 canvas本机方法...)。
我写了一个 canvas 应用程序来画一棵树*。为了动画树的生长,补间 EaselJS graphics 对象似乎比编写自定义绘图函数更干净、更方便。 *(实际上它看起来更像弗吉尼亚苦力怕)
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) 此外,我需要找到一种方法将填充图案定向到生长方向,所以我想我会摆脱矢量形状并在两个 "growth states" 之间插入一些位图.如果有人有更好的主意,我很乐意阅读它。
(不过,如果能回答第一个问题就好了,这可能不是我最后一次尝试对复杂对象进行补间。)
3) 摆脱 EaselJS 的另一个原因是抗锯齿功能不适用。为什么 ?也得调查一下...
希望这个问题能帮助其他人避免一些错误,如果我已经做了一些错误,或者至少会导致更好地理解 easeljs 处理矢量形状的方式。
PS : 这棵树确实有叶子 ;)...但是为了清楚起见,我把它们拔掉了。
我已经更新了您的 Fiddle,现在速度快多了。问题是您在每个循环中创建一个新的 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);