如何降低应用程序对内存和CPU的消耗,提高程序运行效率(二)
一、关于AS3中的提示
在如何降低应用程序对内存和CPU的消耗,提高程序运行效率(一)一文中主要是关于一些较宽泛的注意事项。些来给大家一些特别注意的一些小的细节问题!
使用AS3的一般性注意事项:
- 使用变量时尽可能使用最有效的数据类型。Number要比uint和int的效率低一些,vector要比Array效率更高一些。
- 对于字符串的搜和管理,应使用字符串的自带方法(例如:indexOf()等),而不建议使用效率较低的正则表达式。
- 创建对象是尽可能在循环外部创建对象,而不是在循环内部创建对象。
- 多次使用方括号应用对象会降低性能,因此需注意。例如:
会降低性能的使用如下:
//其中dogs为dog对象池中所创建的对象 for(var i:int = 0 ;i < count ; i ++){//count为对象的个数 dogs[i].name = "哈骑士"; dogs[i].url = "http://http://www.cnblogs.com/xhz-blog"; dogs[i].cry(); }
优化代码如下:
for(var i:int = 0 ; i < count ; i ++){ dog = dogs[i]; dog.name = "哈骑士"; dog.url = "http://http://www.cnblogs.com/xhz-blog"; dog.cry(); }
- 在使用循环时,应尽可能避免表达式计算,我们会很容易使用以代码:
for(var i:int = 0 ; i < dogs.length ; i ++){ //........ }
其实更好的做法是在循环外部用一个变量存贮这个数,然后再使用。
var count:int = dogs.length; for(var i:int = 0 ; i < count ; i++){ //...... }
- 函数调用比将全部或者大部分代码放在一个过程单元的开销大,减少函数调用在某些情况下可以显著提高程序的运行速率,但是从整个代码的架构和可维护性来讲,这将增加开销。这种我们就酌情考虑使用。
- 对于计时器的使用要小心。对于非活跃性的应用程序计时器间隔较长的,使用计时器可以方便管理。而对于活跃性的我们往往使用帧事件处理(Event.ENTER_FRAME),对程序的每一帧进行处理。一般如果程序中确实要使用计时器,我们往往只使用一个计时器来集中管理整个应用程序。
- 能使用异步操作(例如文件或数据库的操作)的绝不使用同步操作。
- 避免使用大型的AS代码库,虽然增加了功能,但是使代码变得臃肿。
二、关于事件处理
- 记得使用removeEventListener()释放不再需要的事件处理程序。
- 考虑使用回掉代替正常的事件来绕过DOM3事件机制。如果不再需要在事件模型中传播事件,则可以在监听程序中调用Event.stopPropagation。
三、界面提示
- 在程序中一般使用开销小的现实对象,一般不到万不得已的时候不使用MoveClip,而是使用占用更少内存的Sprite.
- 如果使用一些不需要用户交互的内容,则使用Shape对象,shape对象其开销远远小于Sprite或MoveClip。
- 如果不再使用现实对象,就将其设置到不可见或者删除它。
- 避免使用滤镜、混合和其他效果,使用这些会使现实对象所需的内存加倍。
- 如果现实对象不需要触摸交互,则可以考虑禁用鼠标输入以减少事件发生。
- 在移动开发中尽量不使用动画对象。
- 如果只是用于显示文本我们就使用TextLine对象,如要用户输入时才使用TextFiled。
- 设置TextFiled内容时使用appendText()比直接设置text属性效率更高。
- 避免在循环内部对TextFiled设置text属性。
其他关于界面的提示:
- 避免使用Graphics类动态绘制,尽可能使用预渲染对象。
- 在BitmapData对象渲染完成后调用dispose()方法立即清理内存。
- 矢量图比位图需要较少的内存,但是占用较多的CPU资源。
- 设置位图大小时往往使用2的整数次幂或者刚刚小于它,例如使用64*64或者63*63但是不要使用65*65。
- 如果在显示对内部使用动画,一般我们要对于容器设置背景颜色。
四、垃圾回收
Air允许通过调用System.gc()强制进行垃圾回收。但不能经常调用它,因为他需要消耗CPU。
五、”洗碗池(kitchen sink)”提示
- 只嵌入实际使用的应用对象(字体、图形等)。
- 尽可能压缩应用程序的一切内容。如减少JPG文件、声音或视频大小。
- 对于移动设备尽可能使用设备字体。
- 为每个想要播放的声音创建单个的Sound实例,用的时候再引用它。
- 在应用程序启动时已经因方式启动任何音乐,将他们存在内存中。称作预加载技术。
- 测试内存量可使用getSize()方法。