Tween24、途中停止でメモリリーク?

by sakusan393
planeボタンを連打してもメモリは解放されます。
parallelボタンを連打するとメモリはどんどん増えます。

二つの処理の違いは基準となるTweenをparallelで包むか包まないかです。
serialで包んだ場合もparallel同様メモリが増えるようです。..
♥0 | Line 80 | Modified 2012-11-07 12:46:37 | MIT License
play

ActionScript3 source code

/**
 * Copyright sakusan393 ( http://wonderfl.net/user/sakusan393 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/sHlt
 */

package
{
    import a24.tween.Tween24;
    import com.bit101.components.PushButton;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.geom.ColorTransform;
    import flash.geom.Rectangle;
    import net.hires.debug.Stats;
    
    /**
     * ...
     * @author ...
     */
    public class TweenTest extends Sprite 
    {
        private var _sourceBmd:BitmapData;
        private var _xyTween:Tween24;
        private var _bmdArray:Array;
        private var _bmArray:Array;
        
        private var _tweenArray:Array = [];
        private var _length:int;
        
        
        public function TweenTest() 
        {
            stage.addChild(new Stats);
                        
            _sourceBmd = new BitmapData(stage.stageWidth, stage.stageHeight);
            _sourceBmd.perlinNoise(128, 128, 2, Math.random() as int, true, true);
            addChild(new Bitmap(_sourceBmd));
            
            _length = 300;
            
            new PushButton(stage, 10, 200, "plane", planeClickHandler);
            new PushButton(stage, 10, 240, "parallel", parallelClickHandler);
        }
        
        private function planeClickHandler(e:MouseEvent):void 
        {
            clear();
            
            _bmdArray = [];
            _bmArray = [];
            
            var ct:ColorTransform = new ColorTransform(1, 1, 1, 1, 50, 50, 50);
            for (var i:int = 0; i < _length; i++)
            {
                _bmdArray[i] = new BitmapData(50, 50);
                _bmdArray[i].draw(_sourceBmd, null, ct, null, new Rectangle(0, 0, 50, 50));
                _bmArray[i] = new Bitmap(_bmdArray[i]);
                this.addChild(_bmArray[i]);
                _tweenArray[i] = Tween24.tween(_bmArray[i], 0.6, Tween24.ease.SineInOut).$$xy(Math.random() * 300, Math.random() * 300)
            }
            _xyTween = Tween24.parallel(_tweenArray);
            _xyTween.play();
        }
        private function parallelClickHandler(e:MouseEvent):void 
        {
            clear();
            
            _bmdArray = [];
            _bmArray = [];
            
            var ct:ColorTransform = new ColorTransform(1, 1, 1, 1, 50, 50, 50);
            for (var i:int = 0; i < _length; i++)
            {
                _bmdArray[i] = new BitmapData(50, 50);
                _bmdArray[i].draw(_sourceBmd, null, ct, null, new Rectangle(0, 0, 50, 50));
                _bmArray[i] = new Bitmap(_bmdArray[i]);
                this.addChild(_bmArray[i]);
                
                _tweenArray[i] =
                    Tween24.parallel(
                        Tween24.tween(_bmArray[i], 0.6, Tween24.ease.SineInOut).$$xy(Math.random() * 300, Math.random() * 300)
                    );
            }
            _xyTween = Tween24.parallel(_tweenArray);
            _xyTween.play();
        }
        
        private function clear():void 
        {
            if (_xyTween) _xyTween.stop();
            else return;

            for (var i:int = 0; i < _length; i++)
            {
                _bmdArray[i].dispose();
                this.removeChild(_bmArray[i]);
            }
            _bmdArray = null;
            _bmArray = null;
        }
        
    }

}