`

Flex优化技巧

    博客分类:
  • Flex
 
阅读更多

http://www.jb51.net/article/18260.htm

 

有些我不确定,需要验证。

 

 

 

1、当创建一个数组的时候避免用new操作符,用 var a:Array = [];而不用var a:Array = new Array(); 

 

2、快速的复制一个数组: 
var copy : Array = sourceArray.concat (); 
3、设置一个数组的值是非常忙的: 
employees.push ( employee ); employees[2] = employee; 
4、从一个数组中取得值的速度是设置一个数组值的两倍快: 
var employee : Employee = employees[2]; 
5、当不需要一个类的实例的时候尽量用静态的属性或方法: 
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; 



6、在整个程序的生命周期中都不会改变的变量用const定义常量: 
public const APPLICATION_PUBLISHER : String = "Company, Inc. "; 
7、当一个类不需要有子类的时候应该将该类声明为final类型的: 
public final class StringUtils 
8、变量和方法的长度在As3中并不影响什么性能,但在别的语言中可能就有影响: someCrazyLongMethodNameDoesntReallyImpactPerformanceTooMuch(); 
9、将语句写在一行上面并不会影响AS3程序的性能,但在别的语言中却有影响: 
var i=0; j=10; k=200; 
10、在内存占用上面if语句和switch语句并没有什么区别: 
语句: 
if ( condition ) { 
// handle condition 

和语句: 
switch ( condition ) { 
case "A ": // logic to handle case A break ; 
case "B ": // logic to handle case B break ; 

占用的内存是一样的. 
11、当你的程序处理分支较多的时候,你应该适当的排列他们出现的顺序,可以参照以下的方式进行: 
if ( conditionThatHappensAlot ) { 
//处理经常发生的业务逻辑 
} else if ( conditionThatHappensSomtimes ) { 
// 处理偶尔会发生的业务逻辑 
} else { 
// 处理几乎不会发生的情况 

12、Actionscript虚拟机(Flash Player)推荐在循环内部用int而不是number,但是flash Player10在flash Player9的基础上做了很多的改进,int,uint和number之间的转换不在像以前那么慢了。 
13、每个变量都应该声明一个确定的类型,解决那些没有指定类型的警告信息活错误信息。 
14、尽量少用unint,它可能会非常慢,但是Flashplayer10做了改进,速度不像以前那么慢了: 
var footerHex : uint = 0x00ccff; 
15、循环遍历的时候用int类型: 
for (var i: int = 0; i < n; i++) 
而不用: 
for (var i: Number = 0; i < n; i++) 
16、在用decimal的时候用number而不用int: 
var decimal : Number = 14.654; 
而不用: 
var decimal : int = 14.654; 
17、用乘法代替除法: 
用100*0.01代替100/100 
18、在for和while循环中用到的计算应事先声明好,而不是在循环中重复声明. 
for (..){ a * 180 / Math .PI ; } 应该在循环的外部申明: toRadians = a*180/Math .PI ; 
19、避免在循环中调用方法或计算: 
var len : int = myArray.lengh; for (var i=0;i<len;i++){} 
而不要用: 
for (var i=0;i< myArray.lengh;i++){ } 
20、用正则表达式进行字符串的校验,用String的方法进行字符串的查找: 
// 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 ); 
21、重复使用诸如DisplayObjects和URLLoaderReuse之类的物体,以保持"内存平稳". 
22、使用组件或创建自定义组件时应遵循Flex的组件模型,如下面的方法为组件创建时应先后调用的方法. 
createChildren(); commitProperties(); updateDisplayList(); 
23、尽量少用dataGrid这样的重量级的组件,除非你用一个常规的list无法实现你要的功能。 
24、避免用Repeater 控件创建scrollable数据. 
25、尽量避免使用setStyle()方法,这个方法在Flex框架里面是众多代价敖贵的方法之一。 
26、当你用过多的容器嵌套的时候会较低应用程序的性能: 
<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> 
27、没有必要每次都用容器组件作为你自定义组件的父控件: 
<mx:Image xmlns:mx="http://www.adobe.com/2006/mxml " source="avatar.jpg " width ="200 " height ="200 " /> 
28、减少不必要的容器嵌套 
29、不要在Panel中vBox和HBox,用Panel的Layout属性就可以了 
30、不要在application标签下用HBox,和Vbox,道理和29一样 
31、设置recycleChildren为true来提高Repeater的性能 (重用已经创建过的children而不是重新创建一个新) 
<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> 
32、将应用程序的帧率设置为60fps或者更低: 
<?xml version ="1.0 " encoding="utf-8 "?> 
<mx:Application xmlns:mx=http://www.adobe.com/2006/mxml frameRate="45 "> 
</mx:Application > 
33、避免每一帧进行过多的显示操作. 
34、能用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 ); 

35、在多帧上面通过以下方式延迟物体的创建. 
<mx:Container creationPolicy="queued "/> 
36、Alpha = 0并不是visible = false (设置为invisible的物体会被忽略,不作任何处理) 
loginButton.visible = false ; 
而不用: 
loginButton.alpha = 0; 
37、性能优化: 
内存释放优化原则 
1. 被删除对象在外部的所有引用一定要被删除干净才能被系统当成垃圾回收处理掉; 
2. 父对象内部的子对象被外部其他对象引用了,会导致此子对象不会被删除,子对象不会被删除又会导致了父对象不会被删除; 
3. 如果一个对象中引用了外部对象,当自己被删除或者不需要使用此引用对象时,一定要记得把此对象的引用设置为 null; 
4. 本对象删除不了的原因不一定是自己被引用了,也有可能是自己的孩子被外部引用了,孩子删不掉导致父亲也删不掉; 
5. 除了引用需要删除外,系统组件或者全局工具、管理类如果提供了卸载方法的就一定要调用删除内部对象,否则有可能会造成内存泄露和性能损失; 
6. 父对象立刻被删除了不代表子对象就会被删除或立刻被删除,可能会在后期被系统自动删除或第二次移除操作时被删除; 
7. 如果父对象 remove 了子对象后没有清除对子对象的引用,子对象一样是不能被删除的,父对象也不能被删除; 
8. 注册的事件 如果没有被移除不影响自定义的强行回收机制,但有可能会影响正常的回收机制,所以最好是做到注册的事件监听器都要记得移除干净。 
9. 父对象被删除了不代表其余子对象都删除了,找到一种状态的泄露代码不等于其他状态就没有泄露了,要各模块各状态逐个进行测试分析,直到测试任何状态下都能删除整个对象为止。 
内存泄露举例 : 
1. 引用泄露:对子对象的引用,外部对本对象或子对象的引用都需要置 null ; 
2. 系统类泄露:使用了系统类而忘记做删除操作了,如 BindingUtils.bindSetter() , ChangeWatcher.watch() 函数 时候完毕后需要调用 ChangeWatcher.unwatch() 函数来清除引用 ,否则使用此函数的对象将不会被删除; 
类似的还有 MUSIC , VIDEO , IMAGE , TIMER , EVENT , BINDING 等。 
3. 效果 泄露:当对组件应用效果 Effect 的时候,当本对象本删除时需要把本对象和子对象上的 Effect 动画 停止掉,然后把 Effect 的 target 对象置 null; 如果不停止掉动画直接把 Effect 置 null 将不能正常移除对象。 
4. SWF 泄露:要完全删除一个 SWF 要调用它的 unload() 方法并且把对象置 null; 
5. 图片泄露:当 Image 对象使用完毕后要把 source 置 null;( 为测试 ) ; 
6. 声音、视频 泄露 : 当不需要一个音乐或视频是需要停止音乐,删除对象,引用置 null; 
内存泄露解决方法: 
1. 在组件的 REMOVED_FROM_STAGE 事件回掉中做垃圾处理操作(移除所有对外引用(不管是 VO 还是组件的都需要删除),删除监听器,调用系统类的清除方法) 
先 remove 再置 null, 确保被 remove 或者 removeAll 后的对象在外部的引用全部释放干净 ; 
2. 利用 Flex 的性能优化工具 Profile 来对项目进程进行监控,可知道历史创建过哪些对象,目前有哪些对象没有被删除,创建的数量,占用的内存比例和用量,创建过程等信息 ;

分享到:
评论

相关推荐

    flex 优化技巧 收集[提升性能]

    非常不错的flex优化技巧 37

    Flex内存优化说明及技巧整理.doc

    Flex 内存 技巧 整理

    Flash,Flex和AIR应用开发内存监测及优化技巧

    Flash,Flex和AIR应用开发内存监测及优化技巧 内容摘要  Flash Player 是如何分配内存的?  Flash Player 是如何完成垃圾回收的?  Flash Player 是如何优化渲染显示的?  你该如何处理以下问题:  事件监听...

    FLEX内存优化技巧集合

    FLEX内存释放优化原则

    Flex与ActionScript3程序开发

    Flex与ActionScript3程序开发》一书由易到难、由浅人深、循序渐进地介绍了Flex与ActionScript3程序开发的一般步骤与常用的程序技巧,内容通俗易懂,使用大量实例贯穿全书,力求以实战的形式让读者快速掌握知识点。...

    [Flex与ActionScript.3程序开发].陈爽,付凯.扫描版

    《Flex与ActionScript 3程序开发》由易到难、由浅人深、循序渐进地介绍了Flex与ActionScript 3程序开发的一般步骤与常用的程序技巧,内容通俗易懂,使用大量实例贯穿全书,力求以实战的形式让读者快速掌握知识点。...

    《Flex与ActionScript程序开发》[PDF]

     本书由易到难、由浅人深、循序渐进地介绍了Flex与ActionScript3程序开发的一般步骤与常用的程序技巧,内容通俗易懂,使用大量实例贯穿全书,力求以实战的形式让读者快速掌握知识点。相信读者在学习完本书后,在...

    FlashFlex和AIR应用开发内存监测及优化技巧

    资源名称:Flash,Flex和AIR应用开发内存监测及优化技巧资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    Flex企业应用开发实战源代码

    最后重点探讨Flex应用性能优化等方面的高级知识。值得一提的是,本书公开了作者努力开发出来的、经实际项目检验过的Flex企业应用框架的源代码,具有非常高的参考价值。 本书对Flex的基础知识着墨不多,所有内容都...

    理解Flex3的组件和框架的生命周期

    由于这种宏观的指导与微观的API 之间的差距,优化开 发成为了一个黑色艺术,需要程序员通过多年的经验在试验和错误中确定最佳的做法。加上 这些与Flex 只有5 年左右的历史,它从最初的表现进化到了引人注目的阶段,...

    flex3的cookbook书籍完整版dpf(包含目录)

    学习常用的提高性能的技巧 21.10节.在组件中创建元数据 第二十二章.模块(Modules)和运行时共享库(RSLs)(669) 22.1节.创建一个运行时共享库 22.2节.使用跨域的RSL 22.3节.使用FlexFramework作为RSL 22.4节.优化RSL ...

    Foundation Actionscript 3.0 Animation

    2.4.2使用FlexBuilder 2.4.3使用免费的命令行编译器 2.4.4关于跟踪 2.4.5缩放影片 2.5使用代码动画 2.5.1循环 2.5.2帧循环 2.5.3剪辑事件 2.5.4事件和事件处理器 2.5.5侦听器和处理器 2.5.6动画事件 2.6显示列表 2.7...

    [Flash.ActionScript.3.0动画教程

    2.4.2 使用Flex Builder 2.4.3 使用免费的命令行编译器 2.4.4 关于跟踪 2.4.5 缩放影片 2.5 程序动画 2.5.1 动画的执行过程 2.5.2 帧循环 2.5.3 影片事件 2.5.4 事件和事件处理 2.5.5 事件侦听器与处理函数 2.5.6 ...

    asp.net知识库

    优化后的通用分页存储过程 sql语句 一些Select检索高级用法 SQL server 2005中新增的排序函数及应用 根据基本表结构及其数据生成 INSERT ... 的 SQL 简便的MS SQL 数据库 表内容 脚本 生成器 将表数据生成SQL脚本的...

    Maven权威指南 很精典的学习教程,比ANT更好用

    提示和技巧 11.7.1. 常见的环境 11.7.2. 安全保护 11.7.3. 平台分类器 11.8. 小结 12. Maven Assemblies 12.1. Introduction 12.2. Assembly Basics 12.2.1. Predefined Assembly Descriptors 12.2.2...

Global site tag (gtag.js) - Google Analytics