4

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

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

谢谢!

4

1 回答 1

4

简单的回答,是的,事件总是被克隆。请参阅文档以确认

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

但是,这并不意味着事件与您的表现无关。它们仅在您重新分派现有事件时才会被克隆,但如果没有,它们仍会作为新实例被分派,这正是 clone 方法正在做的事情。

最后,我们可以在 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 应该在 VM 中将此作为一种特殊情况,在内部,它只是一个指针,它只是在某个地方需要事件时每次都被传递而不是克隆,特别是考虑到 AVM2 的基本设计是一个事件驱动的系统.

于 2012-04-30T20:06:03.240 回答