搜档网
当前位置:搜档网 › 提高flex应用性能的技巧

提高flex应用性能的技巧

有关提高flex应用性能的技巧1.不要使用new操作符创建数组,应使用

var a = [];

而不是:

var a = new Array();

2.创建数组的性能开销很大,请谨慎进行如下操作:

var vanityCollection01 : Array = new Array();

var vanityCollection02 : Array = new Array();

var vanityCollection03 : Array = new Array();

var vanityCollection04 : Array = new Array();

3.最快的数组复制方法:

var copy : Array = sourceArray.concat();

4.为数组中的元素赋值都是比较慢的操作,如:

employees.push( employee );

employees[2] = employee;

5.从数组中读取元素的速度是为元素赋值速度的2倍:

var employee : Employee = employees[2];

6.适当使用静态方法不需要实例化对象,可以提高性能:

StringUtils.trim( "text with space at end " );

Class definition:

package

{

public final class StringUtils

{

public static function trim( s : String ) : String

{

var trimmed : String;

// implementation...

return trimmed;

}

}

}

7.将应用生命周期都不会改变的属性声明为常量:

public const APPLICATION_PUBLISHER : String = "Company, Inc.";

8.当确定一个类不会派生子类时,应使用final修饰符:

public final class StringUtils

9.在ActionScript3中,方法和变量的长度不会对性能造成影响: someCrazyLongMethodNameDoesntReallyImpactPerformanceTooMuch();

10.在一行代码中进行多个变量赋值不会提高性能:

var i=0; j=10; k=200;

11.使用if语句和switch语句无内存开销的差异:

if ( condition )

{

// handle condition

}

使用switch语句:

switch ( condition )

{

case "A":

// logic to handle case A

break;

case "B":

// logic to handle case B

break;

}

12.使用if语句时,尽可能地按照最有可能发生的情况的顺序进行判断和处理:

if ( conditionThatHappensAlot )

{

// logic to handle frequently met condition

}

else if ( conditionThatHappensSomtimes )

{

// handle the case that happens occaisonally

}

else

{

// handle the case that doesn’t happen that often

}

13. AVM 在循环体内部进行计算时,将整型(int)数据提升为浮点型Number进行处理(从版本9到版本10,Actionscript虚拟机已经有所改变,int,uint,number之间的转换速度不再像之前慢了)

14.要解决类型转换,就要先解决未知和不正确的对象类型

15.谨慎使用unit,他可能会较慢(从版本9到版本10,Actionscript虚拟机已经有所改

变,int,uint,number之间的转换速度不再像之前慢了)

var footerHex : uint = 0x00ccff;

16.应在for循环中使用int:

(var i: int = 0; i < n; i++) NOT for (var i: Number = 0; i < n; i++)

17.不要用int类型来表示小数,应使用:

var decimal : Number = 14.654;

而不是:

var decimal : int = 14.654;

18.乘法效率高于除法: 不要用5000/1000 而是: 5000*0.001

19.如果一个值是通过for或者while语句循环多次计算出来的(或者其他耗费较高性能才能得到的值),而且这个值需要在局部多次使用,那么应当在本地将值存储,而不是每次访问该值时重新计算):

for (..){ a * 180 / Math.PI; }

declare: toRadians = a*180/Math.PI; outside of the loop

20.尽量避免在循环体判断条件中进行计算或者方法调用,应当使用:

var len : int = myArray.lengh;

for (var i=0;i

而不是:

for (var i=0;i< myArray.lengh;i++){ }

21.使用正则表达式RegEx进行校验,使用字符串的方法进行查找:

// postal code validation example using regular expressions

private var regEx:RegExp = /^[A-Z][0-9][A-Z] [0-9][A-Z][0-9]$/i;

private function validatePostal( event : Event ) : void

{

if( regEx.test( zipTextInput.text ) )

{

// handle invalid input case

}

}

// search a string using String methods

var string : String = "Search me";

var searchIndex : int = string.indexOf( "me" );

var search : String = string.substring( searchIndex, searchIndex + 2 );

22.尽量重用对象来保持”内存平衡”,这些对象包括DisplayObjects,URLLoader等.

23.遵循flex组件模式(失效机制):

createChildren();

commitProperties();

updateDisplayList();

24.把使用DataGrid组件作为最后的显示手段(如果确信真的没有办法使用常规的手段来实现想要的功能,才使用DataGrid)

25.避免将Repeaters用于能够滚动的数据

26.避免使用setStyle()方法(在flex框架中最消耗性能的方法之一)

27.使用过多的容器将会严重降低系统性能

28.定义组件时不一定总要使用一个容器来作为该组件的顶级标签,也不一定需要顶级容器标签

source="avatar.jpg" width="200" height="200" />

29.清除不必要的容器包装以减少容器的嵌套

30.避免在标签内嵌套Vbox容器(消除冗余)

31.在mx:Application标签内部尽量避免使用Vbox标签(消除冗余).应当使用:

而不是:

32.设置Repeater的recycleChildren的属性为true可以提高Repeater对象的性能(重新利用已创建的子组件而不是再创建一个新的子组件)

[Bindable]

public var repeaterData : Array = ["data 1", "data 2"];

]]>

33.应用的frameRate应设为60fps以内

frameRate="45">

34.避免在一帧中进行过多的显示操作

35.对于重复的操作,应使用ENTER_FRAME事件替代Timer事件:

public function onEnterFrame( event : Event ) : void

{

}

private function init() : void

{

addEventListener( Event.ENTER_FRAME, onEnterFrame );

}

而不是:

public function onTimerTick( event : Event ) : void

{

}

private function init() : void

{

var timer : Timer = new Timer();

timer.start();

timer.addEventListener( TimerEvent.TIMER, onTimerTick );

}

36.在多帧中延迟对象的创建,使用:

37.使组件不可见时使用Alpha=0与visiable=false不是一回事(对象被标记为不可见将不会被(渲染与布局)处理),应当使用:

loginButton.visible = false;

而不是:

loginButton.alpha = 0;

相关主题