测试平台
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;
 }
 }
 }
 }
 
 |