事件冒泡 - 事件是否被克隆?

时间:2012-04-30 19:46:44

标签: actionscript-3 flash

当一个事件在冒泡设置为true的嵌套子项上调度时,事件对象本身是否会为事件在显示堆栈中“冒泡”时遇到的每个显示对象进行克隆?例如,是否为场景中的每个显示对象克隆了Event.ENTER_FRAME事件对象?

在广泛的层面上,我正在尝试确定Event.clone()何时发生以及可能出现性能问题,因为太多事件对象会减慢垃圾收集速度。

谢谢!

1 个答案:

答案 0 :(得分:4)

简单回答,是的,事件总是被克隆。见the documentation to confirm

我原来的答案是错的。事件并不总是被克隆。正如@weltraumpirat指出的那样,文档说这只有在您手动重新调度事件时才会发生。不可能知道Adobe编写了多少个类(如果有的话),但是有些类可能会这样做。我的回答“总是被克隆”是错误的。

但是,这并不意味着事件不是您的表现问题。如果你重新调度一个现有事件,它们只会被克隆,但如果没有,它们仍然会被分派为一个新实例,这正是克隆方法正在做的事情。

最后,我们可以在Tamarin源代码中看到,特别是在globals.as中,dispatchEvent方法的实现:

public function dispatchEvent(event:Event):Boolean  {
    if (event.target && event.target!=null) {
        return dispatchEventFunction (event.clone());
    } else {
        return dispatchEventFunction (event);
    }
}

如您所见,此处根据是否填充了某些事件属性进行克隆。我还没有找到目标属性填充的代码,但无论如何,你有它。只在重新调度现有事件的地方调用clone方法(至少从我们可以看到的内容)。我纠正了。 :)

作为旁注,我认为这是Flash播放器的一个主要缺陷。 Adobe应该在内部的虚拟机中做出这种特殊情况,它只是一个传递的指针,而不是每次在某个地方需要事件时克隆,特别是考虑到AVM2的基本设计是一个事件驱动的系统