AS3におけるガベージコレクションの実験
2008 年 6 月 22 日 日曜日 正宗FlashのAS3でのガベージコレクションについて、ちょっと腑に落ちない点があったので実験してみた。
たぶんFLASH-JP - フォーラム:AS3.0 ガベージコレクションの対象についてと同じ事なんだと思うけど、実際にやってみないと理解が出来ないので。
var stgH:Number =stage.stageHeight; var stgHH:Number = stgH/2; var stgW:Number = stage.stageWidth; function init():void { var timer:Timer = new Timer(10); timer.addEventListener(TimerEvent.TIMER, xOnTimer); timer.start(); } function xOnTimer(e:TimerEvent):void { var sy:Number = Math.sin(Math.PI/180 * e.target.currentCount)*stgHH; sy += stgHH; var sprite:Sprite = new Sprite(); var r:uint = Math.floor(Math.random()*255); var g:uint = Math.floor(Math.random()*255); var b:uint = Math.floor(Math.random()*255); var col:uint = r<<16 | g<<8 | b; sprite.graphics.lineStyle(0, col, 1); sprite.graphics.drawCircle(0,0,10); sprite.addEventListener(Event.ENTER_FRAME, xOnEnterFrame); sprite.x = 1; sprite.y = sy; stage.addChild(sprite); } function xOnEnterFrame(e:Event):void { e.target.x += Math.floor(Math.random()*50); if (e.target.x > stgW) { e.target.removeEventListener(Event.ENTER_FRAME, xOnEnterFrame); e.target.stage.removeChild(e.target as Sprite); //Object(e.target) = null } } init();
これをそのままFlashにコピペすれば動きます。たぶん。FlexやFlexSDKは知らない(たぶん動かん)。
やってること
- init関数(4行目~8行目)
兎に角めちゃくちゃ速く、100分の1秒くらいの間隔でアホみたいにxOnTimer関数を実行しなさいよ!
- xOnTimer関数(9行目から23行目)
とにかく丸い輪っかを書きなさいよ!
- xOnEnterFrame関数(24行目~31行目)
丸い輪っかは兎に角右に移動しなさいよ!
画面はしまで移動したら用済みなんでとにかく消えてしまいなさいよ!
というようなことを書いちょるわけです。
ここで調べたいことは、29行目コメントアウトしたように丸い輪っか(Sprite)の参照は消さなくても大丈夫なん?って事。
モチのロン、ここのコメントアウトを外すと怒られるわけで、怒られるのは嫌だからコメントアウトしてるわけで、「そしたらSpriteの参照は画面からはremoveChildしてるけどメモリには残ったままなんじゃない?」と思って不安でたまらないわけです。
xOnTimer関数の中でSpriteの参照をグローバルなものにしてやってもいいんだけど、え~それってAS2より酷くないか?メモリ管理したいからグローバルな参照にメモリを割り当てるって、何か本末転倒っぽくて気持ちが悪い。
ということで何とかしてxOnEnterFrame関数の中だけでSpriteの参照が消せないか、シコシコとコードを試してみたんですが、結果
ここは参照そのままに残しててもあとで必要に応じてガベージコレクタが消してくれるっぽい。
ず~っと立ち上げててもメモリの使用量はある一定の量からは使わなくなったもん。よくできてますな。
というわけで無駄な悩みで一日つぶしたというお話しでした。ギャフン