我在处理数千个数据时遇到问题。场景是:遍历一个包含超过 40000 个对象的集合(Vector.),并且只绘制不相互重叠的项目;目前我这样做: - 我将可以在正方形中绘制的区域划分(一个向量。包含识别正方形的所有点);- 对于 Vector 中的每个项目。我遍历方块以找出该项目所属的区域;- 我在 Vector 中绘制第一个项目。我将绘制的项目添加到向量中。绘制的项目 - 对于所有剩余的项目,我检查我必须绘制的项目是否与已在通过向量循环的所属区域中绘制的项目重叠。绘制项目:如果它不重叠,我绘制它并将其添加到向量中。绘制的项目,如果它重叠我不绘制它。
为了加快循环,我使用了字典和向量,我在循环之外声明了所有变量,并且我还在使用 Duff 的 actionscript 设备
我的问题是循环仍然很慢(大约 9 秒)。任何想法?
问问题
60 次
2 回答
1
我建议 Alex 的伪线程策略。
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;
}
}
于 2013-10-01T22:41:03.463 回答
0
如果我没记错的话,向量比数组慢。
此外,使用:
var i:uint = 0;
for(i; i < v.length(); i++)
比
for each(asdf in asdf)
(不知道你是如何循环的)。
另外,考虑动态移动和创建数组而不是一个巨大的计算?将其拆分为不同的数组最终可能需要更少的计算
于 2013-10-15T04:01:34.647 回答