测试平台
Windows 7 sp1 x64
Flash builder 4.5.1
IE 9.0 with flash player plug-in 10.3.181.26
测试工具
Profiler
测试内容
- removeChild调用是否必要
- BitmapData的dispose调用是否必要
- Bitmap和BitmapData的对象是否需要设置为null
- BitmapData对象赋值语句的影响
测试结果
removeChild必须调用
dispose并非必要,只需要把其对象设置为null
需要释放任然在作用域中的对象,需要设置其为null
只是增加了引用,所以两个对象的数据是一样的。
结论
不需要的显示对象需要及时调用removeChild删除
不再需要的对象应该手动设为null
如果容器对象没有设置为null,即使调用了removeChild,其元素也不会被释放
测试代码
package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BitmapDataChannel; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.system.System;
public class memtest extends Sprite {
private var bmp:Bitmap; private var mouseDown:Boolean; private var bmpData:BitmapData; private var bitmap:Bitmap; private var memory:uint;
public function memtest() { stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); stage.addEventListener(Event.ENTER_FRAME, onFrame); }
private function onFrame(event:Event):void { if (bmpData != null && bmp != null) { var seed:Number = Math.floor(Math.random() * 10); var channels:uint = BitmapDataChannel.GREEN | BitmapDataChannel.BLUE; bmpData.perlinNoise(100, 100, 6, seed, false, true, channels, false, null); } }
private function onMouseDown(event:MouseEvent):void { memory = System.totalMemory;
if (!mouseDown) { bmpData = new BitmapData(200, 200, false, 0x00CCCCCC); bmp = new Bitmap(bmpData); addChild(bmp);
var bmpDataCloned:BitmapData = bmpData; bitmap = new Bitmap(bmpDataCloned); bitmap.x = 300; addChild(bitmap);
mouseDown = true; } else { removeChild(bmp); bmp.bitmapData.dispose();
bmp = null;
removeChild(bitmap);
bitmap = null;
mouseDown = false; } } } }
|