Hatena::Groupactionscript

ConquestArrow.addEventListener();

2007-05-26

[][]drawRoundRectComplexパフォーマンス対決 20:52 はてなブックマーク - drawRoundRectComplexパフォーマンス対決 - ConquestArrow.addEventListener();

前回の記事で紹介した、drawRoundRectComplex()だが、Flex2には実は同名のメソッドが存在する。mx.utils.GraphicsUtilクラスのdrawRoundRectComplex()メソッドだ。

使い方もほぼ同じで、第一引数に描画対象のGraphicsクラスのインスタンスを指定する以外は同じである。

GraphicsUtil.drawRoundRectComplex(graphics:Graphics, x:Number, y:Number, width:Number, height:Number, topLeftRadius:Number, topRightRadius:Number, bottomLeftRadius:Number, bottomRightRadius:Number):void

これはstaticなメソッドなので実際の使い方は次のようになる。

package{
	//import 
	import flash.display.*;
	import mx.utils.GraphicsUtil;
	[SWF(width="200", height="200")]
	public class GraphicsUtilTest extends Sprite{
		public function GraphicsUtilTest(){
			this.graphics.beginFill(0xFFFFFF);
			GraphicsUtil.drawRoundRectComplex(
				this.graphics,
				10,
				10,
				180,
				180,
				10,	//top left
				10,	//top right
				10,	//bottom left
				10	//bottom right
			);
		}
	}
}

f:id:ConquestArrow:20070526203311p:image

ちなみに、このメソッドは隠しでもなんでもなく、リファレンスに乗っている。

使い方がほとんど同じ、なら気になるのはパフォーマンスの差である。そこでさくっと調べてみた。

テストコード

package {
	import flash.display.*;
	import flash.utils.getTimer;
	import mx.utils.GraphicsUtil;
	
	public class RoundRectComplexTest extends Sprite{
		private static const DRAW_TIMES:uint = 10000;
		public function RoundRectComplexTest(){
			
			var g:Graphics = this.graphics;
			
			trace("Graphics:",this.procGraphics(g));
			trace("GraphicsUtil:",this.procGraphicsUtil(g));
		}
		
		private function procGraphics(g:Graphics):String{
			var old:int = getTimer();
			for(var i:uint; i<DRAW_TIMES; i++){
				g.beginFill(0xFFFFFF);
				g.drawRoundRectComplex(
					10,
					10,
					180,
					180,
					30,
					30,
					30,
					30
				);
			}
			
			return (getTimer() - old).toString();
		}
		
		private function procGraphicsUtil(g:Graphics):String{
			var old:int = getTimer();
			for(var i:uint; i<DRAW_TIMES; i++){
				g.beginFill(0xFFFFFF);
				GraphicsUtil.drawRoundRectComplex(
					g,	//graphics
					10,
					10,
					180,
					180,
					30,
					30,
					30,
					30
				);
			}
			
			return (getTimer() - old).toString();
		}
		
	}
}

それぞれ10000回描画してみてかかった時間を測定した。念のため、10回測定してその平均もだしてみた。結果は以下の表。

GraphicsGraphicsUtil
1回目97132
2回目115134
3回目106132
4回目97131
5回目113155
6回目130151
7回目99140
8回目101141
9回目99135
10回目100132
平均(ms)105.7138.3

mxmlc: Version 2.0.1 build 162628

10000回やって差が約30msだとほとんど差が無いが、それでもやはりGraphics.drawRoundRectComplexの方が速い。

うーん、ドキュメント化されていない謎は深まるばかり。

トラックバック - http://actionscript.g.hatena.ne.jp/ConquestArrow/20070526