Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 在AS3中,将不同的事件类型合并为一个具有多个值的事件类型是否更有效?_Actionscript 3_Flash_Apache Flex_Events_Actionscript - Fatal编程技术网

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

Actionscript 3 在AS3中,将不同的事件类型合并为一个具有多个值的事件类型是否更有效?,actionscript-3,flash,apache-flex,events,actionscript,Actionscript 3,Flash,Apache 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); var b:B = new B(); b.addEventListener(CEvent.TYPE, onCEvent); . . . private function onCEvent(

其中一个比另一个更有效吗


1:

A类内:

var b:B = new B();
b.addEventListener(B.TYPE1, onType1);
b.addEventListener(B.TYPE2, onType2);
b.addEventListener(B.TYPE3, onType3);
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 Event(TYPE1));
.
.
.
dispatchEvent(new Event(TYPE2));
.
.
.
dispatchEvent(new Event(TYPE3));
dispatchEvent(new CEvent(TYPE1));
.
.
.
dispatchEvent(new CEvent(TYPE2));
.
.
.
dispatchEvent(new CEvent(TYPE3));

2:

A类内:

var b:B = new B();
b.addEventListener(B.TYPE1, onType1);
b.addEventListener(B.TYPE2, onType2);
b.addEventListener(B.TYPE3, onType3);
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 Event(TYPE1));
.
.
.
dispatchEvent(new Event(TYPE2));
.
.
.
dispatchEvent(new Event(TYPE3));
dispatchEvent(new CEvent(TYPE1));
.
.
.
dispatchEvent(new CEvent(TYPE2));
.
.
.
dispatchEvent(new CEvent(TYPE3));
C类事件:

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的时间效率要高得多,现在,我需要找到各种方法,使我的代码尽可能快地运行(几乎和视频游戏编程一样)。之前我没有使用第二种技术,所以在整合散布在代码中的不同类型方面需要做很多工作。我需要先问一下,确保这是合理的。谢谢


编辑

我在发布这篇文章后不久才意识到,ActionScript3的事件模型被批评效率低下,主要是因为每次创建事件时都会创建一个全新的对象。创建对象本身可能是一个稍微庞大的过程,因此基于一次又一次创建全新对象的事件模型可能会因此变得相当低效

在我写这个问题的时候,我不知道这是cricism的来源,也不知道对象创建缓慢的事实,从这个角度来看,上述两种方法都不能真正解决这个问题。(方法2可能最终会更糟。)我不想把它作为一个答案,但我确实希望在这个线程上写下一点上下文

  • 您确定需要对其进行优化吗
  • 无论以何种方式,差异都可能可以忽略不计
  • 您的
    开关
    EventDispatcher
    的一个半成品的特殊实现。你正试图发明一辆自行车,它很可能有方轮。这是
    EventDispatcher
    的工作,它提供了一种添加或删除处理程序、管理调用什么处理程序以及何时调用等的工具。如果您对
    EventDispatcher
    的工作方式(为什么?)不满意,那么解决这个问题的方法就是扩展和更改其中的某些内容,或者编写一个替代实现。尝试在本地为少数函数的某些特定情况“修复”它会给代码带来混乱,使其不易维护,而且现在更为冗长

  • 如果您需要类似游戏的效率,我会考虑使用回调或作为信号而不是事件。事件非常缓慢-尤其是冒泡时。回调基本上是指循环依赖项和调用其所有者函数的客户端对象吗?回调是一个函数,您可以将其作为参数传递给另一个函数,以便以后可以执行。它不知道“客户机”或“所有者”,只知道它在其中执行的范围。本质上,您传递给
    addEventListener
    的函数也是回调函数。我认为他指的是直接调用函数对象。我也建议使用信号,因为它们1)速度更快,2)代码更简洁。它们还提供了removeAll函数,这有助于避免标准事件侦听器导致的内存泄漏(需要删除或使用WekReference,我已经读到它并不总是正常工作).我确认我指的是RIAstar描述的回调。基本思想是事件侦听器在时间上是昂贵的;但是这样做,有时你会有一个事件监听器,而不是五个或十个。不管方法2有多尴尬,方法1和方法2的效率如何比较?