4

バブリングが true に設定されたネストされた子でイベントがディスパッチされると、表示スタック全体で「バブリング」している間にイベントがヒットするすべての表示オブジェクトに対して Event オブジェクト自体が複製されますか? たとえば、Event.ENTER_FRAME イベント オブジェクトは、シーンにあるすべての表示オブジェクトに対して複製されますか?

大まかに言うと、Event.clone() が発生するタイミングと、イベント オブジェクトが多すぎてガベージ コレクションが遅くなるパフォーマンスの問題が発生する場所を特定しようとしています。

ありがとう!

4

1 に答える 1

4

簡単な答えです。はい、イベントは常に複製されます。ドキュメントを参照して確認してください。

私の最初の答えは間違っていました。イベントは常に複製されるとは限りません。@weltraumpirat が指摘したように、ドキュメントによると、これはイベントを手動で再ディスパッチした場合にのみ発生します。アドビがこれを行うクラス (存在する場合) がいくつあるかを知ることは不可能ですが、一部のクラスがそうする可能性はあります。それでも、「常に複製される」という私の答えは間違っていました。

ただし、イベントがパフォーマンスの問題ではないという意味ではありません。既存のイベントを再ディスパッチした場合にのみ複製されますが、そうでない場合でも新しいインスタンスとしてディスパッチされます。これはとにかく 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 Player の大きな欠陥だと思います。アドビはこれを VM の特別なケースにするべきでした。特に AVM2 の基本設計がイベント駆動型システムであることを考えると、イベントがどこかで必要になるたびにクローンを作成するのではなく、内部的に渡されるポインターにすぎません。 .

于 2012-04-30T20:06:03.240 に答える