当创建对象时,请注意节俭。在可能的情况下,
重复使用杂项对象。
更好的说法是:
尽可能地重用,但从重复使用杂项对象开始很容易。
这可以为
垃圾收集器节省大量工作,从而影响应用程序的整体性能。这样,您还可以节省创建冗余实例所浪费的时间。
Tip 1: 矩阵。
private static const MATRIX:Matrix = new Matrix();
var bmp:BitmapData = new BitmapData(width, height, true, 0);
MATRIX.identity();
MATRIX.scale(0.5, 0.5);
bmp.draw(source, MATRIX);
var bmp:BitmapData = new BitmapData(width, height, true, 0);
var matrix:Matrix = new Matrix();
matrix.scale(0.5, 0.5);
bmp.draw(source, matrix);
提示2:积分。
private static const ZERO_POINT:Point = new Point();
var thresholdTest:BitmapData = new BitmapData(bmp.width, bmp.height, true, 0);
thresholdTest.threshold(bmp, bmp.rect, ZERO_POINT, ">", 0x10000000, 0xFFFF0000, 0xFF000000);
var thresholdTest:BitmapData = new BitmapData(bmp.width, bmp.height, true, 0);
thresholdTest.threshold(bmp, bmp.rect, new Point(), ">", 0x10000000, 0xFFFF0000, 0xFF000000);
提示3:避免过度使用会为您创建冗余实例的方法,除非这是绝对必要和方便的。或者至少将这些方法的使用减少到应用程序会话期间的单个调用。
localToGlobal()
和globalToLocal()
:尝试自己计算坐标。否则,每次调用都会创建一个Point实例。
getRect()
和getBounds()
:查看是否可以以不需要检测复杂位移的方式构造显示列表。否则,每次调用都会创建一个Rectangle实例。
...rest:Array
:显然,在每次方法调用时,这会创建一个在方法返回时被处理的数组。这是绝对必要的吗?也许您可以在方法外部创建数组,并在每次重用它(请参见下一个提示)?
提示4:在可能的情况下,当您仅将它们用作生成某些结果的容器的单个Array
或Dictionary
实例。
public function generateMeSomeResults(results:Array):void
{
results.length = 0;
}
public function generateMeSomeResults():Array
{
var results:Array = [];
return results;
}
小提示5:不要每次想要更改someDisplayObject.filters时都创建新的数组和新的过滤器对象。如果您在动画过程中使用了过滤器,并且它们在每帧中都有变化,则尤其重要。
private static const EMPTY_FILTERS:Array = [];
private static const GLOW:GlowFilter = new GlowFilter(0xFF0000, 1, 12, 12);
private static const HOVER_FILTERS:Array = [GLOW];
private function onRollOver(event:MouseEvent):void
{
GLOW.color = 0xFF0000+Math.random()*0xFF00;
this.filters = HOVER_FILTERS;
}
private function onRollOut(event:MouseEvent):void
{
this.filters = EMPTY_FILTERS;
}
private function onRollOver(event:MouseEvent):void
{
this.filters = [new GlowFilter(0xFF0000, 1, 12, 12)];
}
private function onRollOut(event:MouseEvent):void
{
this.filters = [];
}
还有一件重要的事情需要注意: DisplayObject.filters
是一个读写器。当你获取DisplayObject.filters
的值时,实际上会创建一个新对象,这并不是你想要的。因此,重用过滤器数组是一个好主意:你一直只有一个实例。
提示6: 对于ColorTransform
对象也同样适用Tip 5。每次更改显示对象的色调都不需要单独的ColorTransform
实例。一旦设置了DisplayObject.transform.colorTransform = someColorTransform;
,就可以自由地更改someColorTransform对象:它不会影响已应用的颜色变换。
就像对待filters
一样,该属性也是一个读写器。当你获取DisplayObject.transform.colorTransform
的值时,实际上会创建一个新对象,这并不是你想要的。参见下面的测试。
import flash.geom.ColorTransform;
var test1:ColorTransform = transform.colorTransform;
var test2:ColorTransform = transform.colorTransform;
trace(test1 == test2); // always false. this object gets created each time on access.