2012-04-30 15 views
4

バブリングがtrueに設定されたネストされた子でイベントが送出されると、イベントスタックは表示スタック全体で「バブリング」しながらイベントが発生するすべての表示オブジェクトに対して、そのイベントオブジェクト自体が複製されますか?たとえば、シーンにあるすべての表示オブジェクトに対してEvent.ENTER_FRAMEイベントオブジェクトが複製されますか?イベントのバブリング - イベントはクローンされますか?

広いレベルで、私はEvent.clone()が発生した場所とガベージコレクションを遅くするイベントオブジェクトの数が多すぎるとパフォーマンス上の問題が発生する場所を特定しようとしています。

ありがとうございます!

+0

私の答えを更新しました、私は間違っていました!私は決して起こらないことを誓う。 ;) –

答えて

4

単純な回答です。はい、イベントは常にクローンされます。 the documentation to confirmを参照してください。

私の元の答えは間違っていました。イベントが必ずしもクローン化されるわけではありません。 @weltraumpiratが指摘しているように、ドキュメンテーションによると、これは、手動でイベントを再配布する場合にのみ発生します。 Adobeが書いたクラスがいくつあるのかは分かりませんが、いくつかのクラスがそうすることも可能です。それでも私の答えは「常にクローンになる」というのは間違っていた。

ただし、これはイベントがあなたのパフォーマンスに問題ではないことを意味するものではありません。既存のイベントを再ディスパッチする場合にのみクローンが作成されますが、そうでない場合は、新しいインスタンスとしてディスパッチされます。クローンメソッドはまったく同じように動作します。

最後に、我々は、特にglobals.asで、タマリンソースコードでdispatchEventメソッドの実装を見ることができます:

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

あなたが見ることができるように、クローニングはどうか、特定のイベントプロパティに基づいて、ここで起こりますポピュレートされます。私はまだターゲットプロパティが設定されているコードを見つけていませんが、あなたはそれを持っています。クローンメソッドは、既存のイベントが再ディスパッチされる場所でのみ呼び出されます(少なくとも、われわれが見ることができます)。私は訂正した。 :)

私はこれがフラッシュプレーヤーの大きな欠陥だと思います。 AdobeはこれをVMの特別なケースとしていたはずですが、内部的には、AVM2のベースデザインがイベント駆動型システムであると仮定すると、イベントがどこかで必要とされるたびにクローニングするのではなく、 。

+0

あなたが言っていること、特にバブリングがプレーヤーの大きな欠陥であることを真剣に疑っているわけではありません...しかし、ドキュメンテーションは 'dispatchEvent(event)'を使って手動でイベントを再ディスパッチする場合を指します。バブリングするときに、「舞台裏で」起こっていることをどのように知っていますか? – weltraumpirat

+0

@weltraumpirat私はあなたに本当に好きです。あなたは私に私の前提に挑戦し、実際にいくつかの具体的な証拠を得るように強制する。笑。 Tamarinのソースコードを数分間見てみましょう。私はあなたに確かにそれを知らせるでしょう。 –

+2

私はあなたについて同じことを考え続けています:) – weltraumpirat

関連する問題