Flex4性能优化 转

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值