« 松本見聞録 | Home | 外部swfの削除はLoader.unloadは使わない方が良いんじゃないかという件に誤りがあった件 »

Apr 062008

外部swfの削除はLoader.unloadは使わない方が良いんじゃないかという件

延々と検証をしてきましたが、なんかLoader.unloadは使わない方が良いのではないか?という結論に至りました。既出だったらスンマセヌ。

追記:06-Apr-2008 20:55:08
以下の検証には誤りがありました。
正確な検証結果はapeirophobia: 外部swfの削除はLoader.unloadは使わない方が良いんじゃないかという件に誤りがあった件を参照してください。スイマセン。

やり方としてはunloadを使う代わりに、removeChildを用いる。
で、子供の方でEvent.REMOVED_FROM_STAGEをlisten。
これをキーにしておけばネストしている子供に対しても一気にremove処理が適応できる。
で、それぞれの子供の中でTwennerやらEventListenerを掃除するprivateメソッド組んでおく。
(当然removeのメソッドの中ではEvent.REMOVED_FROM_STAGEもremoveする)

これで前にやったapeirophobia: Loader.removeChildと同じ検証をしてみた。
結果は以下のとおり。

test.1) removeChild(_loader);_loader= null;
※子供のswfではEvent.REMOVED_FROM_STAGElistenしてない。
080406_d1.jpg
最初:6300kb
080406_d2.jpg
2700回目:8991kb
080406_d3.jpg
5000回目:10502kb
080406_d4.jpg
7500回目:7844kb
080406_d5.jpg
10000回目終了:10252kb。最後にGCが発動していないので、高めの値になっているけど、まぁ結構いい感じ。

で、色々やっているとなんかEvent.REMOVED_FROM_STAGEをしているほうがGCの利きが良いような感じだったので、子供swfでEvent.REMOVED_FROM_STAGEをlistenしているタイプのものも検証。

test.2)子供のswfでEvent.REMOVED_FROM_STAGEをlisten。
080406_c1.jpg
最初:6263kb。
080406_c2.jpg
2600回目:7856kb。イイヨー。
080406_c3.jpg
5100回目:7819kb。イイネー。
080406_c4.jpg
7500回目:6996kb。オオー。
080406_c5.jpg
10000回目終了:10928kb。
んーさほど変わらなかった・・・w
Event.REMOVED_FROM_STAGEのlistenに何か秘密があったりしたらうれしかったけど
特に何もなさそう。

まぁでもほぼメモリはクリーンな状態をキープできるようになった。
ヤターー!!。


ということでLoaderで呼び出した外部コンテンツの削除は
removeChildで行って、子供はEvent.REMOVED_FROM_STAGEで自分の身の回りを整理するっつーことで・・。1万回のLoadを何回も試していたら7時間もかかった・・・。眠い。

Leave a comment

Search and Archives