如何降低应用程序对内存和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()方法。
posted @ 2013-10-07 01:05  重庆-崽崽  阅读(964)  评论(0编辑  收藏  举报