Flex4性能优化总结
作者:hangge | 2014-11-07 15:50
为保证Flex程序运行的流畅,高效。本人总结了一下几条技巧:
1,当创建一个数组的时候避免用new操作符,用var a:Array = [];而不用var a:Array = new Array();
2,快速的复制一个数组:
var copy:Array = sourceArray.concat ();
3,在整个程序的生命周期中都不会改变的变量用const定义常量
public const APPLICATION_PUBLISHER : String = "Company, Inc. ";
4,当一个类不需要有子类的时候应该将该类声明为final类型的
public final class StringUtils
5,尽量避免使用setStyle()方法,这个方法在Flex框架里面是众多代价昂贵的方法之一。
6,能用ENTER_FRAME事件就不用Timer事件
//使用
public function onEnterFrame(event:Event) : void { }
private function init():void {
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
//而不使用Timer
public function onTimerTick(event:Event) : void { }
private function init():void {
var timer:Timer = new Timer();
timer.start();
timer.addEventListener(TimerEvent.TIMER, onTimerTick);
}
7,对于自定义的ItemRenderer,如果不需要背景透明,或者使用自己绘制背景。
建议把opaqueBackground属性设置成一个固定的颜色,这样渲染器能够忽略透明度计算提高性能。
而且如果绘制自己的背景,那么把autoDrawBackground设置成false, 这一操作将会指示Flex不要浪费时间来绘制一个你无论如何都会覆盖的默认背景。
比如下面这个例子,ItemRenderer里面使用自行绘制的渐变背景。我们就可以吧autoDrawBackground设置成false,同时opaqueBackground随便设置成一个固定的值。
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
opaqueBackground="0x000000"
autoDrawBackground="false">
<s:Rect left="0" right="0" top="0" bottom="0">
<s:fill>
<s:LinearGradient rotation="90">
<s:GradientEntry color="#FF0000" ratio="0"/>
<s:GradientEntry color="#DD0000" ratio=".66"/>
</s:LinearGradient>
</s:fill>
</s:Rect>
<s:Label id="labelDisplay" left="5" right="5" top="15" bottom="15"/>
</s:ItemRenderer>
8,ItemRenderer内部设置数据的时候,避免使用绑定,因为使用绑定的话会调用额外的ActionScript代码。通常,我们可以通过覆盖set data方法来设置数据。
比如,原来通过绑定是这样:
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark">
<s:Label id="姓名" value="{data.name}" fontSize="12"/>
</s:ItemRenderer>
我们可以改成用set data的方式:
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark">
<fx:Script>
<![CDATA[
override public function set data(value:Object):void
{
super.data = value;
if (data)
{
nameLab.text = data.name;
}
else
{
nameLab.text = "";
}
}
]]>
</fx:Script>
<s:Label id="nameLab" value="{data.name}" fontSize="12"/>
</s:ItemRenderer>
9,ItemRenderer内部如果要显示外部图像时,使用共享图像缓存ContentCache
使用共享图像缓存ContentCache,使得图像加载过一次以后,在外部视图滚动的时候不必重新加载。使用方法:声明一个静态的ContentCache实例,并将它设置给任一个BitmapImage组件的contentLoader属性,这样该类型的所有渲染器将共享这个ContentCache实例,自动地加载并缓存图像。
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
initialize="initializeHandler(event)">
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
import spark.core.ContentCache;
static private const iconCache:ContentCache = new ContentCache();
private function initializeHandler(event:FlexEvent):void
{
icon.contentLoader = iconCache;
}
override public function set data(value:Object):void
{
super.data = value;
if (data)
{
icon.source = data.imageUrl;
}
else
{
icon.source = null;
}
}
]]>
</fx:Script>
<s:BitmapImage id="icon" top="10" left="5" width="32" height="32" />
</s:ItemRenderer>
10,使用Group取代BorderContainer
BorderContainer是一种可以绘制边框和背景的容器,但有时我们可以使用包含一个Rect的Group来获得相同的效果,并获得更好的性能。
比如原来我们是这么使用BorderContainer:
<s:BorderContainer width="200" height="200"
backgroundColor="#CCCCCC" borderColor="#999999">
</s:BorderContainer>
现在可以使用Group来实现同样的效果:
<s:Group width="200" height="200">
<s:Rect left="0" right="0" top="0" bottom="0">
<s:fill>
<s:SolidColor color="#CCCCCC"/>
</s:fill>
<s:stroke>
<s:SolidColorStroke color="#999999"/>
</s:stroke>
</s:Rect>
</s:Group>
11,如果要隐藏页面上组件,使用includeIn或者excludeFrom,而不是设置visible属性
使用includeIn和excludeFrom将不应该可见的组件从显示列表中删除,就不会再对它们进行渲染处理。 相反,如果将visible设置为false,那么组件将仍然保留在显示列表上,这样需要执行不必要的布局操作和渲染。
12,显示嵌入图像,使用BitmapImage而不是Image
BitmapImage组件是一个轻量级版本的Image组件。 这两个组件都能够显示嵌入式的图像组件。
两者之间最大的差异是:1,Image能够运行时加载外部图像,而BitmapImage需要一些设置才能加载外部图像。2,与BitmapImage不同,Image的皮肤也是可换的并且支持丢失图像指示器。 对于嵌入图像,不需要这些功能,应该使用轻量级的BitmapImage组件。
比如,原来使用Image组件来显示:
<s:Image source="@Embed('assets/bg.jpg')"/>
可以使用BitmapImage来代替:
<s:BitmapImage source="@Embed('assets/bg.jpg')"/>
13,使用png格式的图片,而不是gif或jpeg格式的图片
运行时对PNG文件格式进行解码时速度要快得多,如果可以的话,应该尽可能使用PNG来代替GIF和JPEG图片。
14,需要矩形阴影或圆角矩形阴影的话。使用RectangularDropShadow,而不是DropShadowFilter。
<s:Group width="300" height="150" horizontalCenter="0" verticalCenter="0">
<s:RectangularDropShadow id="dropShadow" blurX="10" blurY="10" alpha="0.5" distance="3"
angle="90" color="#000000" left="0" top="0" right="0" bottom="0" blRadius="8" brRadius="8"
tlRadius="8" trRadius="8" />
</s:Group>
15,如果不需要的话,把这四个属性设为false可以节约资源,提高效率
this.mouseChildren = false;
this.mouseEnabled = false;
this.tabChildren = false;
this.tabEnabled = false;
原文出自:www.hangge.com 转载请保留原文链接:http://m.hangge.com/news/cache/detail_403.html