Flash Player的内存管理
Flash Player分配给Flash/Flex应用程序的多数内存是相对小块的,由于太多的小而频繁的内存分配活动会比较耗时,Flash Player会从操作系统获取大块内存,大块内存会被分割成由固定大小的小块内存组成的内存池。下图展示了组成内存池的两种情况:左边的是Flash Player从内存获取一大块内存,然后分割成由256 bytes组成的内存池;右边的情况是一大块内存分割成由512 bytes组成的内存池
当一个内存池被占满后,Flash Player会向操作系统获取一块新内存。
Flash Player 虚拟机中的垃圾回收
Flash Player虚拟机中包含一个标准的标记清除垃圾回收器,该回收器会分段地增量扫描来清除闲置对象,如果一个对象没有活动的引用指向它,则这个对象是可以被垃圾回收的。针对这种回收机制,这里有几个小技巧:
1、创建事件监听时启用弱引用,例如
addEventListener(“click”,buttonHandler,false,0,true) |
最后一个参数为true时表示启用了弱引用。
2、使用弱字典项,例如
new Dictionary(true) |
参数为true表示创建了一个启用了弱引用的字典对象。
3、 如果EventListener没有启用弱引用,不用时要显式地移除该EventListener。例如Flex3中使用 removeEventListener()方法移除;在 Spark 框架中(Flex 4)中,使用partAdded()添加EventListener,使用partRemoved()移除。
垃圾回收的时机
垃圾回收并不是一直在运行的,“收垃圾的人只在周五清晨来”。当某块内存被释放后,它并不一定会被在下次内存分配中使用,而仅由垃圾回收器标记它为未使用。已经使用的内存仍保持不变,这就像从电脑中把文件放到回收站中并没有改变硬盘空间,除非是从回收站再把文件清除。
只有当一个内存池快被占满的时候,向操作系统申请新的内存块之前会尝试执行垃圾回收。
强类型是你的朋友
优先使用Vector而不是Array(如果类型是单一的int 类型的话)。Vector是Flash Player10中新增的类型,性能得到改进,允许你在数据结构中使用强类型标记它的内容。
在你的代码中使用强类型,例如
var n:Number或var b:Boolean或var foo:Button |
这样会改进性能并减少内存开销。另外优先使用int而不是Number。
当可能的时候,消除子表达式。通常出现在for 循环中,例如
var temp:Array=[1,2,3];for(var i:int=0;i<temp.length;i++){
//blah } |
应改为:
var count:int=temp.length;for(var i:int=0;i<count;i++){
//blah } |
Flash Player 如何优化渲染显示
接触过Flash的人都知道,Flash有一个帧的概念,简单地说Flash是一帧一帧地在运行,每一帧的画面都不一样这样来实现动画效果。Flash Player在每一个帧周期执行指令操作是建立在可变跑道(Elastic Racetrack)上的。如下图所示:
在Flash Player执行一帧的周期里,前一部分时间用于执行代码,剩余时间用于渲染显示列表中的对象。每个执行阶段都可以根据实际需求增加执行时间来执行更多代码或做更多的渲染工作,而跑道的总长度也将相应增长。
开发Flex应用时,需要使用失效/验证模式利用可变跑道来高效的完成工作。这种模式主要包括三组方法:更新组件属性、更新尺寸信息、更新渲染和位置。如下图:
这是一个很大的话题,在这里就不进行展开了,感兴趣的话可以上网查阅相关资料或者找我一起讨论。
合理使用一些方法
有些操作性能开销很大,需要精明的使用它们。
describeType()是一个高性能开销的方法,setStyle()也是一个。别在组件构建的早期使用setStyle(),否则你可能不得不重做这部分工作。
可以在在CreationComplete 之后使用setStyle()。使用选择器(类的或者类型的)来应用样式,而不是在大量的对象上一个一个的setStyle()
如何优化你的布局
1、避免多层嵌套组件容器,尽可能的使用绝对坐标布局。例如
<mx:VBox><mx:HBox>
<mx:Button/> <mx:CheckBox/> </mx:HBox> <mx:HBox> <mx:Button/> <mx:CheckBox/> </mx:HBox> </mx:VBox> |
可以的话最好改为
<mx:Canvas><mx:Button x=”0″ y=”0″/>
<mx:CheckBox x=”50″ y=”0″/> <mx:Button x=”0″ y=”30″/> <mx:CheckBox x=”50″ y=”30″/> </mx:Canvas> |
2、Flex 4中推荐使用Group组件作为基本容器。
Group(VGroup,HGroup,TileGroup)组件是轻量级的容器(相对于VBox,HBox, Grids);默认没有滚动功能(使用Scroller 类);默认没有Clipping;为MXML 图片进一步优化:
(1)图形会共享显示对象,当可能的时候,它们会画在他们的父或兄弟显示对象中
(2)在一个图形元素上设置alpha,blendMode,filter 或者Z-older 则使它不能共享显示对象。