减少随机颜色梯度补间中的滞后(以编程方式生成)

时间:2014-03-05 17:15:24

标签: actionscript-3 lag greensock tweenmax

你好,

我正在使用随机颜色渐变补间进行一些测试(将它们用作背景)。在尝试了不同的事情之后,我发现了一个代码here,并稍微将其改为下面的代码,不幸的是,这会产生很多延迟(干扰定时器,因此在同一个类中)。我正在使用GreenSock TweenLite / TweenMax引擎:

package{

//...

    public class Main extends MovieClip{

        var color1:uint = Math.floor(Math.random()*0xFFFFFF + 1);
        var color2:uint = Math.floor(Math.random()*0xFFFFFF + 1);
        var colors:Object = {left:color1, right:color2};
        var newColor1:uint = Math.floor(Math.random()*0xFFFFFF + 1);
        var newColor2:uint = Math.floor(Math.random()*0xFFFFFF + 1);
        var newColors:Object = {left:newColor1, right:newColor2};
        var mySprite:Sprite = new Sprite();

        public function Main() {
            mySprite.x = 0;
            mySprite.y = 0;
            stage.addChildAt(mySprite, 1);
            drawGradient();
            animateBackground();

            //...

        }

        //...
        function drawGradient(){
            var m:Matrix = new Matrix();
            m.createGradientBox(805, 485, 0, 0, 0);
            mySprite.graphics.beginGradientFill(GradientType.LINEAR, [colors.left, colors.right], [1, 1], [0x00, 0xFF], m, SpreadMethod.REFLECT);
            mySprite.graphics.drawRoundRect(0,0,805,485, 0);
            stage.setChildIndex(mySprite, 1);
        }
        function animateBackground(){
            TweenMax.to(colors, 3, {hexColors:{left:newColor1, right:newColor2}, onUpdate:drawGradient, onComplete:reRandomize});
        }
        function reRandomize(){
            color1 = newColor1;
            color2 = newColor2;
            newColor1 = Math.floor(Math.random()*0xFFFFFF + 1);
            newColor2 = Math.floor(Math.random()*0xFFFFFF + 1);
            animateBackground();
        }

一切正常,但滞后不断增加。为了让自己成为一个想法,之前36 kB大的swf,只需使用这种颜色就可以达到74 kB。

我想知道是否有更有效的方法来处理这种影响,或者代码中特别滞后的东西。有人知道吗?任何帮助都会很棒,非常感谢。

提前谢谢!

注意:我知道这是几次测试后滞后的原因,禁用了不同的东西,因此过度延迟不太可能来自其他来源。

1 个答案:

答案 0 :(得分:0)

您忘记清除mySprite中的旧图形,因此任何额外的命令都会在该精灵上的图层上生成图层。在绘制另一个渐变之前,请先mySprite.graphics.clear()调用drawGradient函数。

    function drawGradient(){
        var m:Matrix = new Matrix();
        m.createGradientBox(805, 485, 0, 0, 0);
        mySprite.graphics.clear(); // here
        mySprite.graphics.beginGradientFill(GradientType.LINEAR, [colors.left, colors.right], [1, 1], [0x00, 0xFF], m, SpreadMethod.REFLECT);
        mySprite.graphics.drawRoundRect(0,0,805,485, 0);
        stage.setChildIndex(mySprite, 1);
    }