BitmapDataを関数内で扱う時の注意

February 26, 2008

関数内でローカルな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();
		}
	}
}

気をつけませう。

0 Comments »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment

This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
(c) 2012 Muraken.biz | powered by WordPress with Barecity