2012-04-30 20 views
4

當事件在鼓泡設置爲true的嵌套子節點上分派時,事件對象本身是否會針對顯示堆棧上的「冒泡」時事件命中的每個顯示對象進行克隆?例如,是否爲場景中的每個顯示對象克隆了Event.ENTER_FRAME事件對象?事件冒泡 - 事件是否被克隆?

在廣泛的層面上,我試圖確定何時發生Event.clone(),以及它可能成爲性能問題,因爲太多的事件對象會減慢垃圾回收速度。

謝謝!

+0

更新了我的答案,我錯了! :噢,我發誓永遠不會發生。 ;) – 2012-04-30 22:00:07

回答

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); 
    } 
} 

正如你所看到的,克隆發生在這裏根據是否某些事件屬性被填充。我還沒有找到目標屬性填充的代碼,但無論如何,你有它。克隆方法僅在現有事件被重新調度的情況下調用(至少從我們可以看到的情況來看)。我立場糾正。 :)

作爲一個方面說明,我認爲這是Flash播放器的一個主要缺陷。 Adobe應該在虛擬機中使用這種特殊情況,在內部,它只是一個指針,而不是克隆每一次需要事件的地方,特別是考慮到AVM2的基本設計是事件驅動系統。

+0

不是我嚴重懷疑你在說什麼,特別是關於冒泡是玩家的一個主要缺陷......但是文檔只是指那些使用'dispatchEvent(event)'手動重新分派事件的場合。你怎麼知道它發生在「幕後」當冒泡? – weltraumpirat

+0

@weltraumpirat我必須說,我真的很喜歡你。你迫使我挑戰我的假設,並實際得到一些具體的證據。大聲笑。讓我在Tamarin源代碼中徘徊幾分鐘,然後我會讓你知道。 – 2012-04-30 20:11:23

+2

我一直在想你:) – weltraumpirat