我在处理数千个数据时遇到问题。
场景是:循环遍历包含超过40000个对象的集合(Vector。),并仅绘制彼此不重叠的项目;
目前我这样做:
- 我划分我可以在正方形中绘制的区域(Vector。包含识别正方形的所有点);
- 对于Vector中的每个项目。我遍历正方形以找出该项目所属的区域;
- 我在Vector中绘制第一个项目。然后我将绘制的项目添加到Vector。绘制的项目
- 对于所有剩余物品,我检查我必须绘制的项目是否与已经在通过Vector循环的所属区域中绘制的项目重叠。绘制的项目:如果它不重叠我绘制它并将其添加到Vector。绘制的项目,如果它重叠我不画它。
为了加快循环,我使用字典和向量,我在循环外声明所有变量,我也使用Duff的设备进行动作准备
我的问题是循环仍然很慢(大约9秒)。任何的想法?
答案 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)
(不确定你是如何循环的)。
另外,考虑动态移动和创建数组而不是一个巨大的计算?将它拆分成不同的数组最终可能需要更少的计算