在AS3中,将不同的事件类型合并为只有一个具有多个值的事件类型是否更有效?

时间:2013-01-25 16:10:36

标签: actionscript-3 flash flex events actionscript

其中一种比另一种更有效吗?


1:

在A组中:

var b:B = new B();
b.addEventListener(B.TYPE1, onType1);
b.addEventListener(B.TYPE2, onType2);
b.addEventListener(B.TYPE3, onType3);

在B组中:

dispatchEvent(new Event(TYPE1));
.
.
.
dispatchEvent(new Event(TYPE2));
.
.
.
dispatchEvent(new Event(TYPE3));

2:

在A组中:

var b:B = new B();
b.addEventListener(CEvent.TYPE, onCEvent);
.
.
.
private function onCEvent(pEvent:CEvent):void
{
    switch (pEvent.code)
    {
        case B.TYPE1:
            onType1();
            break;

        case B.TYPE2:
            onType2();
            break;

        case B.TYPE3:
            onType3();
    }
}

在B组中:

dispatchEvent(new CEvent(TYPE1));
.
.
.
dispatchEvent(new CEvent(TYPE2));
.
.
.
dispatchEvent(new CEvent(TYPE3));

Class CEvent:

public class CEvent extends Event
{
    public static const TYPE:String = "cEvent";

    private var m_strCode:String;
    public function get code():String
    {
        return m_strCode;
    }

    public function CEvent(pCode:String, bubbles:Boolean=false,
            cancelable:Boolean=false)
    {
        super(TYPE, bubbles, cancelable);
        m_strCode = pCode;
    }

    override public function clone():Event
    {
        return new CEvent(m_strCode, bubbles, cancelable);
    }
}

我的理解是#2比#1更节省时间,现在,我需要真正找到各种方法让我的代码几乎尽可能快地运行(几乎与视频游戏编程的背景)。早些时候我没有使用第二种技术,所以要整合遍布我的代码的不同类型将会有很多工作要做。我需要先问一下,确保这是合理的。谢谢!


修改

我在发布这篇文章后意识到的一点是,ActionScript 3的事件模型因效率低而受到批评,主要是因为每次创建事件时都会创建一个全新的对象。创建对象本身就是一个稍微过于庞大的过程,因此基于一遍又一遍地创建全新对象的事件模型可能是相当低效的直接结果。

当我写这个问题的时候,我并不知道这是诡计的来源,或者是对象创造缓慢的事实,并且把它置于那个角度,以上任何一种方法都不会真的做得太多解决这个问题。 (方法2可能最终会更糟。)我不想把它作为一个答案,但我确实希望在这个帖子上放下一点上下文。

1 个答案:

答案 0 :(得分:2)

  1. 您确定需要对其进行优化吗?
  2. 无论哪种方式,差异都可以忽略不计。
  3. 您的switchEventDispatcher意图做的半生不熟的临时实施。你正试图发明一辆自行车,而且很可能有方形车轮。这是EventDispatcher的工作,提供添加或删除处理程序的工具,管理处理程序被调用的时间等等。如果您对EventDispatcher的工作方式不满意(为什么?) - 通往解决它是扩展和更改其中的内容,或编写替代实现。试图在某些特定的情况下在本地“修复”它会给你的代码带来混乱,使其不易维护,而且现在看起来更冗长。