动画在一段时间后滞后 - Easeljs缓存

时间:2016-09-27 09:33:40

标签: javascript html5-canvas createjs easeljs

动画在加载时效果不错,但过了一段时间它就会滞后。我首先在for循环中创建了新的drops变量。实现全球化并没有帮助。 fps为40 {5} particles。有什么帮助吗?

function init(){
  stage = new createjs.Stage("rain-canvas");
  createjs.Ticker.setFPS(fps);
  createjs.Ticker.addEventListener("tick", refresh);
}

function refresh(){
  for(var i = 0; i < particles; i++){
    drops = new createjs.Shape();
    xxx = Math.random() * viewportWidth;
    yyy = -10 + Math.random() * 10;
    drops.graphics.beginFill('#fff').rect(xxx, yyy, 2, 18);
    drops.alpha = 0.15 + Math.random() * 0.5;
    stage.addChild(drops);

    TweenLite.to(drops, 1.25, {y: viewportHeight + 150,
      onComplete: function(){
        stage.removeChild(drops);
      }, ease: Power1.easeNone
    });
  };
  stage.update();
}

2 个答案:

答案 0 :(得分:2)

点击此处查看答案:EaselJS with 200+ vector shapes : performance and aesthetics

您不应该在每个框架中创建新的Shape。而是做一次并保存它,并将其添加到舞台上。之后您可以更新图形命令。如果您需要进一步的帮助,请随时发布一个工作示例(在jsfiddle上),我会相应地更新它。

答案 1 :(得分:2)

@derz答案已经足够,但我想提出一个建议。

粒子几乎绝对不应该是形状。几百后,形状变得非常昂贵。缓存可以产生巨大的差异,在您的情况下,您只有一个形状,尽管每次都会以不同的方式绘制x / y。

为了简化这一点:

  1. 绘制一次形状(在0,0处)并将其缓存
  2. 请改用位图,并指向缓存的形状
  3. 每次直接设置x / y
  4. 以下是一个快速示例:http://jsfiddle.net/r0f04fvt/

    缓存形状

    var template = new createjs.Shape();
    template.graphics.beginFill('#fff').rect(0, 0, 2, 18);
    template.cache(0,0,2,18); // Cache it
    
    var drops = new createjs.Bitmap(template cacheCanvas);
    

    您可以做的另外一件事,在粒子引擎中很常见,就是聚集粒子,而不是不断地破坏/创建粒子。查看对象池以获取更多信息。