处理数以千计的数据

时间:2013-10-01 20:41:29

标签: flex loops vector actionscript

我在处理数千个数据时遇到问题。 场景是:循环遍历包含超过40000个对象的集合(Vector。),并仅绘制彼此不重叠的项目; 目前我这样做: - 我划分我可以在正方形中绘制的区域(Vector。包含识别正方形的所有点); - 对于Vector中的每个项目。我遍历正方形以找出该项目所属的区域; - 我在Vector中绘制第一个项目。然后我将绘制的项目添加到Vector。绘制的项目 - 对于所有剩余物品,我检查我必须绘制的项目是否与已经在通过Vector循环的所属区域中绘制的项目重叠。绘制的项目:如果它不重叠我绘制它并将其添加到Vector。绘制的项目,如果它重叠我不画它。
为了加快循环,我使用字典和向量,我在循环外声明所有变量,我也使用Duff的设备进行动作准备
我的问题是循环仍然很慢(大约9秒)。任何的想法?

2 个答案:

答案 0 :(得分:1)

我建议亚历克斯的伪线程策略。

http://blogs.adobe.com/aharui/2008/01/threads_in_actionscript_3.html

 public class PseudoThread extends EventDispatcher
 {
     public function PseudoThread(sm:ISystemManager, threadFunction:Function, threadObject:Object)
     {
         fn = threadFunction;
         obj = threadObject;

         // add high priority listener for ENTER_FRAME
         sm.stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler, false, 100);
         sm.stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
         sm.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);

         thread = new UIComponent();
         sm.addChild(thread);
         thread.addEventListener(Event.RENDER, renderHandler);
     }

     // number of milliseconds we think it takes to render the screen
     public var RENDER_DEDUCTION:int = 10;

     private var fn:Function;
     private var obj:Object;
     private var thread:UIComponent;
     private var start:Number;
     private var due:Number;

     private var mouseEvent:Boolean;
     private var keyEvent:Boolean;

     private function enterFrameHandler(event:Event):void
     {
        start = getTimer();
        var fr:Number = Math.floor(1000 / thread.systemManager.stage.frameRate);
        due = start + fr;

        thread.systemManager.stage.invalidate();
        thread.graphics.clear();
        thread.graphics.moveTo(0, 0);
        thread.graphics.lineTo(0, 0);   
     }

     private function renderHandler(event:Event):void
     {
         if (mouseEvent || keyEvent)
             due -= RENDER_DEDUCTION;

         while (getTimer() < due)
         {
            if (!fn(obj))
            {
                if (!thread.parent)
                    return;

                var sm:ISystemManager = thread.systemManager;
                sm.stage.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
                sm.stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
                sm.stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
                sm.removeChild(thread);
                thread.removeEventListener(Event.RENDER, renderHandler);
                dispatchEvent(new Event("threadComplete"));
            }
         }

         mouseEvent = false;
         keyEvent = false;
     }

     private function mouseMoveHandler(event:Event):void
     {
        mouseEvent = true;
     }

     private function keyDownHandler(event:Event):void
     {
        keyEvent = true;
     }
 } 

答案 1 :(得分:0)

如果我没记错的话,矢量比数组慢。

另外,使用:

var i:uint = 0;
for(i; i < v.length(); i++)

for each(asdf in asdf)

(不确定你是如何循环的)。

另外,考虑动态移动和创建数组而不是一个巨大的计算?将它拆分成不同的数组最终可能需要更少的计算