トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   ActionScript 3.0 特設会議室
     AS3.0 ガベージコレクションの対象について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
nekoyuki
Åê¹ÆNo.33072
投稿日時: 2007-4-20 13:59
半人前
居住地: 大阪府
投稿: 48
使用環境:
FLASH CS3 Professional
XP Pro(SP2)
AS3.0 ガベージコレクションの対象について
ちょっと実験してみました。
下記の様なコードです。

//本体?変数mc
var mc:MovieClip = new MovieClip();
//リファレンス?変数adr
var adr:MovieClip = mc;
mc.x = 10;
trace("本体"+mc.x);
trace("リファレンス"+adr.x);
delete mc;
mc = null;
trace("本体を消した後?"+adr.x);
trace("結論として変数mcですらリファレンスではないのか??");


実行結果:
本体10
リファレンス10
本体を消した後?10
結論として変数mcですらリファレンスではないのか??


本体(?)である変数mcにnullを代入したはず
なのですがまだ変数adrで値が参照出来てしまいます。

リファレンスのDisplayObjectContainer.removeChild () メソッドの一文によるとこう記述されています。

ガベージコレクターとは、Flash Player が未使用のメモリースペースを再割り当てする処理のことです。変数またはオブジェクトがアクティブに参照されなくなり、任意の場所に保存されていない場合、ガベージコレクターによってメモリー内が探索され、それらに対する参照が存在しなければメモリースペースを占有している変数またはオブジェクトが一掃されます。

つまりは変数adrにもnullを代入しなければガベージコレクションの対象にされないと言う事でしょうか?
これでは無闇にDisplayObject系のインスタンスの参照をする変数を作ることは出来ないと言う訳で恐ろしくて夜も眠れません
(今まで頻繁にmcの参照を使ってスクリプトを組んでいたので・・・)

removeChildしたインスタンスが
プロパティparentがnullになるだけで
まるごと生存しており、
再び、addChildすると再利用出来てしまいます。
明示的に完全にインスタンスを消すことは不可能なのでしょうか?

野中文雄
Åê¹ÆNo.33074
投稿日時: 2007-4-20 14:27
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: AS3.0 ガベージコレクションの対象について
ガベージコレクション」というのは、そういう仕組みだと思います。これまでも、Objectや配列も、参照の存在によりメモリが保持されていました。タイムライン上の実体に従属するMovieClipが、むしろ特異な存在だったといえます。
引用:
nekoyukiさんは書きました:
つまりは変数adrにもnullを代入しなければガベージコレクションの対象にされないと言う事でしょうか?

addChild()メソッドを呼出す前にすでにインスタンスは存在している訳ですから、removeChild()メソッドでインスタンスがなくなってしまったら整合性が取れません。

ディスプレイ(表示)リストへの追加は、ステージ上に表示する階層(ツリー)構造に加えるだけのことです。逆に、これまでできなかった別のインスタンス(DisplayObjectContainer)の子どもに移動するということも、この仕様により実現可能となりました。
引用:
removeChildしたインスタンスが
プロパティparentがnullになるだけで
まるごと生存しており、
再び、addChildすると再利用出来てしまいます。

必要のない参照(変数)を、すべて破棄すれば可能です。
引用:
明示的に完全にインスタンスを消すことは不可能なのでしょうか?


----------------
 

nekoyuki
Åê¹ÆNo.33179
投稿日時: 2007-4-27 2:40
半人前
居住地: 大阪府
投稿: 48
使用環境:
FLASH CS3 Professional
XP Pro(SP2)
Re: AS3.0 ガベージコレクションの対象について
野中様

返信が遅れまして誠に申し訳ありません。

折角、ご教授頂いたのですが
未だ理解出来ていません。

自分なりにさらに実験を重ねているのですが
どうしても解せないのです。

// UltraHeavyMCとは複雑な描画やネスト構造を持つ
// 物凄い重いムービークリップのクラスです。

addEventListener("enterFrame",func);
function func(evt:Event){
    new UltraHeavyMC();
}
このコードであれば
EnterFrame上でnewしまくるわけですが
何も変数で参照しないので
ガベージコレクションの対象になるだろうと
期待したのですが結果は
描画もしていないのにも関わらず
CPU利用率とPF使用量がガンガン上がって行きました。


addEventListener("enterFrame",func);
var arr:Array = new Array(new UltraHeavyMC());
function func(evt:Event){
	arr.push(new UltraHeavyMC());
	arr[arr.length - 2] = null;
}
続いては配列に格納し、ひとつ前のindexの配列にはnullを代入して
常にひとつ分のUltraHeavyMCしか生存しない事を期待しましが
やはりCPU利用率とPF使用量がガンガン上がって行きました。


本当にガベージコレクションの処理が行われるのかどうかも
疑心暗鬼になってしまいました。

もしかしたらネストしてるムービークリップにも
nullを参照させなければいけないのだとしたら
かなり管理が大変になると思われます・・。

AS3以前ではremoveMovieClipさえすれば
ゴミが溜まっていくなんて事は起きなかったのですが
今回は見えない所でゴミがどんどん溜まっていきます。
コードを作る側にとってかなり恐ろしい事です。

この様なケースはどうしたら良いのでしょうか?
野中文雄
Åê¹ÆNo.33180
投稿日時: 2007-4-27 3:15
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: AS3.0 ガベージコレクションの対象について
removeEventListener()を実行しても、メモリは解放されませんか? だとしたら、メモリリークの可能性があると思います。
引用:
nekoyukiさんは書きました:
// UltraHeavyMCとは複雑な描画やネスト構造を持つ
// 物凄い重いムービークリップのクラスです。

addEventListener("enterFrame",func);
function func(evt:Event){
    new UltraHeavyMC();
}
このコードであれば
EnterFrame上でnewしまくるわけですが
何も変数で参照しないので
ガベージコレクションの対象になるだろうと
期待したのですが結果は
描画もしていないのにも関わらず
CPU利用率とPF使用量がガンガン上がって行きました。


----------------
 

nekoyuki
Åê¹ÆNo.33192
投稿日時: 2007-4-28 16:24
半人前
居住地: 大阪府
投稿: 48
使用環境:
FLASH CS3 Professional
XP Pro(SP2)
Re: AS3.0 ガベージコレクションの対象について
引用:
野中文雄さんは書きました:
removeEventListener()を実行しても、メモリは解放されませんか? だとしたら、メモリリークの可能性があると思います。


removeEventListenerもそうですが
この様に間隔を空けて実行すれば
CPU利用率とPF使用量の上昇は見受けられませんでした。

var mc:UltraHeavyMC = new UltraHeavyMC();
var cnt:uint = 0;
addEventListener("enterFrame",func);
function func(event:Event){
	cnt++;
	if(cnt % 50 == 0){
		mc = new UltraHeavyMC();
	}
}



しかしまだ不可解な事があります。
次のケースはaddChildとremoveChildを繰り返した場合なのですが
addChild後CPU使用率とPF使用量が上昇します。
ですがその後removeChildして参照をnullにしたにも関わらず
PF使用量が解消されず、そのまま上昇する一方です。
(CPU使用率は下がります)

var mc = this.addChild(new UltraHeavyMC());
var cnt:uint = 0;
addEventListener("enterFrame",func);
function func(event:Event){
	cnt++;
	if(cnt % 50 == 0){
		if(cnt % 100 == 0){
			mc = this.addChild(new UltraHeavyMC());
		} else {
			var remove = this.removeChild(mc);
			mc = null;
			remove = null;
		}
	}
}


ただUltraHeavyMCから複雑な入れ子のMCをやめた途端、
PF使用量の上昇は見受けられなくなりました。
その辺りが関連するのでしょうか?
(単純にビットマップを置きまくるなど複雑な描画はOKみたいです)

nekoyuki
Åê¹ÆNo.33207
投稿日時: 2007-4-30 18:21
半人前
居住地: 大阪府
投稿: 48
使用環境:
FLASH CS3 Professional
XP Pro(SP2)
Re: AS3.0 ガベージコレクションの対象について
原因ですがなんとなく解りました。
どうやらビットマップキャッシュが犯人の様です。

ビットマップキャッシュをやめた途端、
PF使用量の上昇が止まりました。
(scriptで記述するcacheAsBitmapも同様です)

ただremoveChildをした時に全く開放されないのは
理解出来ません。
Public Alphaのバグなのでしょうか?
(またはプレイヤーのバグ?)

バグだとしたら
CS3では直っていたらいいんですが・・・。
野中文雄
Åê¹ÆNo.33209
投稿日時: 2007-5-1 10:56
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: AS3.0 ガベージコレクションの対象について
ガベージコレクションが起きるタイミング」は、システム(Flash Player)任せで、事前予測ができないというのはこの機能の欠点として挙げられています。
引用:
nekoyukiさんは書きました:
removeEventListenerもそうですが
この様に間隔を空けて実行すれば
CPU利用率とPF使用量の上昇は見受けられませんでした。

DisplayObjectContainer.removeChild()メソッドを呼出したら、タイミングのずれはともかく、ビットマップキャッシュも解放されるべきです。間もなく英語版のTrialはアップロードされるでしょうから、この問題は確認しておきたいですね。
引用:
nekoyukiさんは書きました:
ただremoveChildをした時に全く開放されないのは
理解出来ません。


----------------
 

nekoyuki
Åê¹ÆNo.33280
投稿日時: 2007-5-9 1:53
半人前
居住地: 大阪府
投稿: 48
使用環境:
FLASH CS3 Professional
XP Pro(SP2)
Re: AS3.0 ガベージコレクションの対象について
ついにCS3の体験版が出ましたね!
早速解析してみます。
nekoyuki
Åê¹ÆNo.33281
投稿日時: 2007-5-9 3:41
半人前
居住地: 大阪府
投稿: 48
使用環境:
FLASH CS3 Professional
XP Pro(SP2)
Re: AS3.0 ガベージコレクションの対象について
CS3で検証しました。
テスト用のスクリプトではPF使用量の上昇は見受けられませんでした。

ただテストとは別のちょっと説明し難い複雑なスクリプトがあるのですがそちらでは一方的には上昇しないもののPF使用量が上昇しました。開放されないことは無いのですが。

開放されるタイミングはちょっと微妙です・・。

仰られている様に事前予測ができないみたいですね。

この件の結果についてですが
作りを誤るとメモリを使い過ぎる危険がやはりあると思います。
ビットマップキャッシュの使用は注意が必要ですね・・。
野中文雄
Åê¹ÆNo.33530
投稿日時: 2007-5-31 22:23
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: AS3.0 ガベージコレクションの対象について
ビットマップキャッシュの問題について触れたものではありませんが、Adobeの上条さんのblogに「Flash Player 9 のガーベジコレクション」という記事が掲載されました。ActionScript 3.0(AVM2)のガベージコレクションの仕組みを理解するのに役立ちます。


----------------
 

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops