AS3 最佳技巧和实践

在网络上找到很多关于 AS3 实践优化的资料,自己整理下(自己还没有验证过,有时间再写测试代码):

  1. new Array () 和 new Object () 比直接用 [] 和 {} 慢 3 倍的效率:
    var a = [];
    var b = {};
    代替
    var a =new Array();
    var b = new Object;
  2. 数组的索引用整数: list[int(0)]比直接用list[0]快。
  3. Array 的创建是消耗是非常大的,所以不要这样做,尽可能重复利用,更新数组相对性能小很多:
    var vanityCollection01 : Array = new Array();
    var vanityCollection02 : Array = new Array();
    var vanityCollection03 : Array = new Array();
    var vanityCollection04 : Array = new Array();
  4. 更快的数组拷贝:
    var copy : Array = sourceArray.concat();
  5. 用 {} 的匿名对象创建比 new 快:
    var o : * = {firstName:"John",lastName:"Smith",age:45 };
    NOT:
    var p : Person = new Person();
    p.firstName = "John";
    p.lastName = "Smith";
    p.age = 45;
  6. 静态函数应用,不需要创建对象实例:
    StringUtils.trim( "text with space at end " );
    类定义:
    package
    {
         public final class StringUtils
             {
              public static function trim( s : String ) : String
              {
                   var trimmed : String;
                   // implementation... 
                   return trimmed;
               }
          }
    }
  7. 在应用程序中,常量定义是无法修改的:
    public const APPLICATION_PUBLISHER : String = "Kannopy, Inc.";
  8. 不想被继承的类,可以用 final 来修饰:
    public final class StringUtils
  9. package 级别的函数和变量,不需要类和对象实例,直接调用(这些好像还没怎么用到):
    createSnapShot( arg );
    不需要:
    someObjectInstance.createSnapShot( arg );
    SomeClass.createSnapShot( arg );
    类定义:
    package
    {
         // imports…; 
         public function createSnapShot(target:IBitmapDrawable) : Bitmap
         {
              // implementation… 
          }
    }
  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;
}

<li>AVM中用int比Number在执行循环速度要快:
(var i: int = 0; i < n; i++) NOT for (var i: Number = 0; i < n; i++)
  • uint 要少用,比较慢:
    var footerHex : uint = 0x00ccff;
    for (;i<n2;i++) Vector3D(array[int(i*2)]).x = 2;
    不要用(因为会自动转为 Number 的):
    for (;i<n2;i++) Vector3D(array[i*2]).x = 2;
  • 不要用 int 来赋值小数:
    var decimal : Number  = 14.654;
    不要用(因为会自动转为 Number 的):
    var decimal : int  = 14.654;
  • 用乘法来代替除法:5000/1000=>5000*0.001:
  • 不要在循环内执行相同的运算:
    for (..){a*180/Math.PI;}
    声明: toRadians = a*180/Math.PI; 放置到循环外面
    for (var i=0;i< myArray.lengh;i++){ }
    应该采用:
    var len : int = myArray.lengh;
    for (var i=0;i<len;i++){}
  • 使用完事件监听需要 remove 掉
    removeEventListener( Event.COMPLETE, onComplete );
  • 使用 delete 释放内存
    delete someObject;
  • 使用正则表达式验证,使用字符串搜索
    // 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 );

    <li>重用对象特别是(DisplayObjects, URLLoader),保持内存使用平稳,因为创建这些对象会使得cpu和内存占用加大,可能导致画面不流畅。</li>
    <li>使用delete释放内存
    
    delete someObject;

    继续补充中……