一项功能与多项功能的性能

Performance of one function vs. multiple

我在舞台上拖放了很多对象,默认代码片段为每个对象在舞台上添加了一个新的事件侦听器和函数:

stage.addEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop);
function fl_ReleaseToDrop(event:MouseEvent):void { instance_1.stopDrag(); }
stage.addEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop_1);
function fl_ReleaseToDrop_1(event:MouseEvent):void { instance_2.stopDrag(); }
....

将它们全部放在一个监听器中是更好还是更坏?

stage.addEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop);
function fl_ReleaseToDrop(event:MouseEvent):void {
  instance_1.stopDrag();
  instance_2.stopDrag();
  ....
}

一个函数调用肯定比多个函数调用快。但是,这里的差异可以忽略不计。

从代码的可读性来看stand-point,我认为你展示的单一函数调用更好。


一般来说,我喜欢drag-and-drop的做法是在开始拖动时添加mouseUp处理程序,拖动完成后立即将其删除。例如:

instance1.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
instance2.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
instance3.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);

function mouseDown(e:MouseEvent):void {
    Sprite(e.currentTarget).startDrag();
    stage.addEventListener(MouseEvent.MOUSE_UP, mouseUp);
}

function mouseUp(e:MouseEvent):void {
    stopDrag();
    stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUp);
}

对于 Flash 时间轴简单高效的解决方案,您只需保留对对象的引用即可:

stage.addEventListener(MouseEvent.MOUSE_UP, mouseUp);
instance1.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
instance2.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
instance3.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
var draggedObject:Sprite;

function mouseDown(e:MouseEvent):void 
{
    draggedObject = e.currentTarget as Sprite;
    if(draggedObject)
    {
        draggedObject.startDrag();
    }        
}

function mouseUp(e:MouseEvent):void 
{
    if(draggedObject)
    {
        draggedObject.stopDrag();
        draggedObject = null;
    } 
}