BitmapData内存测试

测试平台
Windows 7 sp1 x64
Flash builder 4.5.1
IE 9.0 with flash player plug-in 10.3.181.26

测试工具
Profiler

测试内容

  1. removeChild调用是否必要
  2. BitmapData的dispose调用是否必要
  3. Bitmap和BitmapData的对象是否需要设置为null
  4. BitmapData对象赋值语句的影响

测试结果

  1. removeChild必须调用

  2. dispose并非必要,只需要把其对象设置为null

  3. 需要释放任然在作用域中的对象,需要设置其为null

  4. 只是增加了引用,所以两个对象的数据是一样的。
    结论

  5. 不需要的显示对象需要及时调用removeChild删除

  6. 不再需要的对象应该手动设为null

  7. 如果容器对象没有设置为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();
// bmpData.dispose();
// bmpData = null;
bmp = null;

removeChild(bitmap);
// bitmap.bitmapData.dispose();
bitmap = null;

mouseDown = false;
}
}
}
}