flash开发中提高性能方法的整理-------------垃圾回收机制的总结

如何提高flash开发中的性能,一直以来倒是个讨论很强烈热闹的话题。记得每次参加flash技术交流会,性能相关的提问是至关多的。在这里整理下有关性能优化的具体方法:

 
垃圾回收机制的总结
1、被删除对象在外部的所有引用一定要被删除干净才能被体系当成垃圾收受接管处理掉。
2、父对象内部的子对象被外部其它对象引用了,会导致此子对象不会被删除,子对象不会被删除又会导致了父对象不会被删除。
3、如果1个对象中引用了外部对象,当本身被删除或者不需要使用此引用对象时,一定要记得把此对象的引用设置为null。
四、本对象删除不了的原因不一定是本身被引用了,也可能是本身的孩子被外部引用了,孩子删不掉导致父亲也删不掉。
5、除了引用需要删除外,体系组件或者全局工具、管理类如果提供了卸载方法的就一定要调用删除内部对象,否则可能会造成内存泄露和性能丧失。
6、父对象立刻被删除了不代表子对象就会被删除或立刻被删除,可能会在后期被体系自动删除或第二次移除操作时被删除。
七、如果父对象remove了子对象后没有清除对子对象的引用,子对象一样是不能被删除的,父对象也不能被删除。
八、注册的事件如果没有被移除不影响自界说的强行收受接管机制,但可能会影响没事了的收受接管机制,所以最好是做到注册的事件***都要记得移除干净。
9、父对象被删除了不代表其余子对象都删除了,找到一种状态的泄露代码不等于其它状态就没有泄露了,要各板块各状态逐个举行测试分析,直到测试任何状态下都能删除整个对象为止。
10、当触发了某个event后,不再使用的话,请将其remove掉。
11、能不使用Effect就不要使用Effect。

 

 
内存泄露举例:
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泄露:要完全删除1个SWF要调用它的unload()方法并且把对象置null。
5、图片泄露:当Image对象使用完结后要把source置null。
6、声音、视频泄露: 当不需要1个音乐或视频是需要停止音乐,删除对象,引用置null。


内存泄露解决方法:
1. 在组件的REMOVED_FROM_STAGE事件回掉中做垃圾处理操作(移除所有对外引用(无论是VO还是组件的都需要删除),删除***,调用体系类 的清除方法) 先remove再置null, 确保被remove或者removeAll后的对象在外部的引用全部释放干净。
2. 利用Flex的性能优化工具Profile来对项目进程项举行监控,可知道历史创建过哪些对象,目前有哪些对象没有被删除,创建的数量,占用的内存比例和用量,创建过程等信息。
总结:要害还是要做好清除工作,本身设置的引用本身要记得删除,本身用过的体系类要记得做好收受接管处理工作。 以上不懂的题目解决的好的话不需要自界说强制收受接管器也可能被体系没事了的自动收受接管掉。
众所周知,由于Flash Player的垃圾收受接管机制是自动举行的,是以就算是上面所说的内容的内容都符合要求,那末还是会产生内存“高居不下于”的情况。
是以,我接下来介绍1个很是规的体式格局,让Flash Player的垃圾收受接管机制在我的控制之中。(以下的内容也不是我创始的,但是就此总结说明一下) 一优化计算方法
1.用乘法来代替除法(当除数可转化为有限数的时辰)。好比var n:Number = value * 0.5;要比var n:Number = value / 2;快。但差别并不是很大。只有在需要大量计算情况下,好比3D引擎中差别才比较较着。
2.用位运算代替除2或乘2。好比10>>1要比10*2快,而10<<1要比10*2快。从测试来看位运算几乎比乘除快 一倍,但是一般情况下,我们不能选择位运算,好比我们就不能用13>>1来代替13/2,尽管前者比后者运算速度更快,但2者的运算结果却不 一样。所以还是要看具体情况。
3.用unit()或int()代替取整运算Math.floor()和Math.ceil()。好比var test:uint = uint(1.5);要比var test:Number = Math.floor(1.5);快;而var test:uint = uint(1.5)+1;要比var test:Number = Math.ceil(1.5);也快。若是Math.floor(),还可以用位运算(>>0)来代替。好比var test:uint =1.5>>0,比unit()或int()更快。
4.用乘-1来代替Math.abs()方法。好比var nn:Number = -23;var test:Number= nn < 0 ? nn * -1 : nn;要比var nn:Number = -23;var test:Number = Math.abs(nn);快。
当然还有更多的优化计算的方法。一般来讲,低级运算要比高级运算速度;内部方法比调用其它方法速度快。另外要注意的是,这些方法有的时辰可能并一定合用.

posted on 2011-09-28 14:26  AS3.0  阅读(588)  评论(0编辑  收藏  举报

导航