BitmapDataを関数内で扱う時の注意
関数内でローカルなBitmapDataを一時的にローカルなBitmapに入れたりすると、メモリに残っていってしまうのか、途中から正常に動かなくなってしまうようです。
複数のBitmapDataを使ってごにょごにょして、最終的にあるBitmapDataを作りたい時とかに、途中で一回まとめるためにローカルなBitmapを使おうとしたのですが、”途中から正常に動かない”という現象に陥ったので調べてみました。
超シンプルにしたダメなコードはこんな感じ。
package {
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.Event;
public class DrawTest extends Sprite {
private var cnt:int;
public function DrawTest():void {
cnt = 0;
addEventListener(Event.ENTER_FRAME, drawBmd);
}
private function drawBmd(e:Event):void {
trace(++cnt);
var bmd:BitmapData;
var bmp:Bitmap;
for (var i:int = 0; i < 20; i++) {
bmd = new BitmapData(400, 400);
bmp = new Bitmap(bmd);
}
}
}
}
上のコードで実行すると僕のPCでは81ループ目に必ず、
81
ArgumentError: Error #2015: BitmapData が無効です。
at flash.display::BitmapData$iinit()
at DrawTest/::drawBmd()
とエラーが。
ローカル変数でもダメナノネー!!
というわけで、解決するには用がなくなった後にdispose()すればいい感じ。
エラーは一応出なくなりました。
package {
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.Event;
public class DrawTest extends Sprite {
private var cnt:int;
public function DrawTest():void {
cnt = 0;
addEventListener(Event.ENTER_FRAME, drawBmd);
}
private function drawBmd(e:Event):void {
trace(++cnt);
var bmdArray:Array = [];
var bmd:BitmapData;
var bmp:Bitmap;
for (var i:int = 0; i < 20; i++) {
bmd = new BitmapData(400, 400);
bmdArray.push(bmd);
bmp = new Bitmap(bmd);
}
for each(bmd in bmdArray) bmd.dispose();
}
}
}
気をつけませう。