用actionscript 3开发的同学都知道,根据名称获取显示对象可以通过getChildByName函数,那么,这个系统函数效率怎么样呢?我们做一个测试

  1. package { 
  2.     import flash.display.DisplayObject; 
  3.     import flash.display.Sprite; 
  4.     import flash.events.MouseEvent; 
  5.     import flash.utils.getTimer; 
  6.  
  7.     /** 
  8.      * @author hangler@163.com 
  9.      */ 
  10.     public class Main extends Sprite { 
  11.  
  12.         public function Main():void { 
  13.             var sp:Sprite = new Sprite(); 
  14.             sp.graphics.beginFill(0xff00ff); 
  15.             sp.graphics.drawRect(0, 0, 400, 400); 
  16.             sp.graphics.endFill(); 
  17.             addChild(sp); 
  18.             addEventListener(MouseEvent.CLICK, onClick); 
  19.             createSps(100000); 
  20.         } 
  21.  
  22.         private function createSps(num:int):void { 
  23.             for (var i:int = 0; i < num; i++){ 
  24.                 var sp:Sprite = new Sprite(); 
  25.                 sp.name = "name" + i; 
  26.                 addChild(sp); 
  27.             } 
  28.         } 
  29.  
  30.         private function onClick(e:MouseEvent):void { 
  31.             var time:int = getTimer(); 
  32.             var test:DisplayObject = getChildByName("name10000"); 
  33.             trace(getTimer() - time); 
  34.         } 
  35.     } 

就是在场景中创建10万个对象,然后获取第1万个,在我的机器上执行时间为1毫秒

如果换成

  1. var test:DisplayObject = getChildByName("name50000"); 

执行时间为3毫秒

如果换成

  1. var test:DisplayObject = getChildByName("name90000"); 

执行时间为6毫秒

以上充分说明,getChildByName函数为遍历查找,效率本身并没有做什么优化

同样的代码换成

  1. var test:DisplayObject = getChildAt(90000); 

执行时间为0,说明显示对象在系统内是以显示层数为序存在数组里面

经过这样的测试,我想大家应该知道怎么去合理使用以及自己实现优化的方式来获取对象了。