加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

提高flex应用性能方法(二)

发布时间:2020-12-15 01:00:51 所属栏目:百科 来源:网络整理
导读:1. 不要使用new操作符创建数组,应使用 var a = []; 而不是: var a = new Array(); 2. 创建数组的性能开销很大,请谨慎进行如下操作: var vanityCollection01 : Array = new Array(); var vanityCollection02 : Array = new Array(); var vanityCollection03 :
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&#8217;t happen that often } 13. AVM 在循环体内部进行计算时,将整型(int)数据提升为浮点型Number进行处理(从版本9到版本10,Actionscript虚拟机已经有所改变,int,uint,number之间的转换速度不再像之前慢了) 14. 要解决类型转换,就要先解决未知和不正确的对象类型 15. 谨慎使用unit,他可能会较慢(从版本9到版本10,Actionscript虚拟机已经有所改变,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<len;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. 使用过多的容器将会严重降低系统性能 <mx:Panel> ??? <mx:VBox> ??????? <mx:HBox> ??????????? <mx:Label text="Label 1" /> ???????????? <mx:VBox> ????????????????? <mx:Label text="Label 2" />? ????????????? </mx:VBox> ????????????? <mx:HBox> ????????????????? <mx:Label text="Label 3" /> ????????????????? <mx:VBox> ????????????????????? <mx:Label text="Label 4" /> ????????????????? </mx:VBox> ????????????? </mx:HBox> ????????? </mx:HBox> ????? </mx:VBox> </mx:Panel> 28. 定义组件时不一定总要使用一个容器来作为该组件的顶级标签,也不一定需要顶级容器标签 <mx:Image xmlns:mx="http://www.adobe.com/2006/mxml"? ???? source="avatar.jpg" width="200" height="200" /> 29. 清除不必要的容器包装以减少容器的嵌套 30. 避免在标签内嵌套Vbox容器(消除冗余) <mx:Panel> ??? <mx:Label text="Label 1" /> ??? <mx:Label text="Label 2" /> </mx:Panel> <mx:Panel> ???? <mx:VBox> ??????? <mx:Label text="Label 1" /> ??????? <mx:Label text="Label 2" /> ??? </mx:VBox> </mx:Panel> 31. 在mx:Application标签内部尽量避免使用Vbox标签(消除冗余).应当使用: <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx=http://www.adobe.com/2006/mxml> ??? <mx:Label text="Label 1" /> ??? <mx:Label text="Label 2" /> </mx:Application> 而不是: <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx=http://www.adobe.com/2006/mxml> ??? <mx:VBox> ??????? <mx:Label text="Label 1" /> ??????? <mx:Label text="Label 2" /> ??? </mx:VBox> </mx:Application> 32.设置Repeater的recycleChildren的属性为true可以提高Repeater对象的性能(重新利用已创建的子组件而不是再创建一个新的子组件) <mx:Script> ??? <![CDATA[ ??????? [Bindable] ??????? public var repeaterData : Array = ["data 1","data 2"]; ??? ]]> </mx:Script>? <mx:Repeater id="repeater" dataProvider="{repeaterData}">? ??? <mx:Label text="data item: {repeater.currentItem}"/> </mx:Repeater> 33. 应用的frameRate应设为60fps以内 <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx=http://www.adobe.com/2006/mxml? ??? frameRate="45"> </mx:Application> 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. 在多帧中延迟对象的创建,使用: <mx:Container creationPolicy="queued"/>? 37. 使组件不可见时使用Alpha=0与visiable=false不是一回事(对象被标记为不可见将不会被(渲染与布局)处理),应当使用: loginButton.visible = false; 而不是: loginButton.alpha = 0;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读