Progression Forum
9月 03, 2010, 02:44:07 午前 *
ようこそゲストさん。まずは、ログインするか、ユーザ登録してください。
アクティべーションメール送られて来ませんでしたか?

ユーザ名、パスワード、クッキー保持期間を入力してログインして下さい。
お知らせ:
 
   ホーム   ヘルプ 検索 ログイン 登録  
ページ: [1]
  印刷  
投稿者 スレッド: LoadChildした外部swfを完全にUnloadするには  (参照数 4362 回)
古間
初心者
*
投稿: 1


プロフィールを見る
« 投稿日:: 12月 20, 2008, 10:53:23 午後 »

以下に試してみたことを説明します
現状ではどれもうまくUnloadされていません。

Progression3を使っています。
クラス定義のすぐ後に、var com:LoadChild;
_onCastAdded()の中でcom=LoadChild(this,new URLRequest("a.swf"))にて自身(シーンのキャスト)の表示リストに外部swfを追加しました。外部swfはムービークリップを継承したクラスで音を再生しています。
→表示はできました。

_onCastRemoved()の中でUnloadChild(this,com.loader)
パブリッシュして実行すると、外部swfを読み込んだシーンに行く度にcpu使用率が上がっていきます。
外部swfの表示もシーンの表示の数、重なっているような見え方をしています。音も、そのシーンに行くほど重なっていきます。
→どうも完全にUnloadされていないようです。

そこで、_onCastRemoved()内で
removeChild(com.loader);
com.loader.unload();

onCastAdded()内でLoadChildの前に
if(com!=null){
removeChild(com.loader);
com.loader.unload();
}

としてみたところ、外部swfの表示が重なる件は解消されたのですが
音の重なりは改善されませんでした。

そこで、読み込むswfのドキュメントクラスに以下のように記述しました。
this.loaderInfo.addEventListener(Event.UNLOAD, closeAllStreams);
function closeAllStreams(e:Event) { 
sound.close();
sound.close();
}
しかし状態変わらずです。


どうしたら完全にUnloadできるのでしょうか、
お力をお借りしたいです。よろしくお願いします
« 最終編集: 12月 20, 2008, 10:55:33 午後 by 古間 » IP記録
nium
管理人
住民メンバー
*****
投稿: 277


プロフィールを見る
« 返信する #1 投稿日:: 12月 22, 2008, 03:34:27 午後 »

ご報告ありがとうございます。

現在、パッケージ自体のかなり巨大なものになってきているので、まずは破綻なく動作するように精度向上を最優先としているため、メモリ使用量などに十分に配慮できていないのが正直なところです。
今回の件についてもこちらで調査を行い、結果が分かり次第ご報告させていただきますね。
IP記録
nium
管理人
住民メンバー
*****
投稿: 277


プロフィールを見る
« 返信する #2 投稿日:: 12月 23, 2008, 01:37:44 午前 »

メモリについて、検証が完了したのでご報告します。
以下のコードを実行して、メモリの使用状況をモニタしましたが、問題なく GC が実行されて読み込んだコンテンツが破棄されているようです。

コード:
protected override function _onLoad():void {
var require:URLRequest = new URLRequest( "external.swf" );

var com1:LoadChild = new LoadChild( progression.container, require );
var com2:LoadChild = new LoadChild( progression.container, require );
var com3:LoadChild = new LoadChild( progression.container, require );

// 実行したいコマンドを登録します。
addCommand(
com1,
new Wait( 1000 ),
com2,
new Wait( 1000 ),
com3,
new Wait( 1000 ),
new UnloadChild( progression.container, com1.loader ),
new Wait( 1000 ),
new UnloadChild( progression.container, com2.loader ),
new Wait( 1000 ),
new UnloadChild( progression.container, com3.loader ),
new Wait( 1000 ),

// 強制 GC を実行する
function():void {
try {
new LocalConnection().connect( "foo" );
new LocalConnection().connect( "foo" );
} catch ( e:Error ) {}
},
new Wait( 1000 )
);
}

ですので、今回の件は LoadChild / UnloadChild の問題ではなく、外部 SWF ファイル内での破棄処理がうまく動作していないのではないかと思いますので、ぜひそちらを確認してみてください。
IP記録
nipx
初心者
*
投稿: 7


プロフィールを見る
« 返信する #3 投稿日:: 4月 23, 2009, 04:41:47 午後 »

niumさま。

ご検証されたコードで読み込まれている、external.swfですが、ドキュメントクラスにCastSpriteなどProgressionのディスプレイオブジェクトを継承した場合、GCされないってことはございませんでしょうか。

私の使い方が間違っているのかもしれないのですが、external.swfのドキュメントクラスにCastSpriteやCastMovieClipなどProgressionのオブジェクトを使った場合、またはexternal.swfにCastSpriteなどを継承したシンボルがある場合にうまくメモリが解放されていないような気がしています。いかがでしょうか。
IP記録
ページ: [1]
  印刷  
 
ジャンプ先:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS!