«

»

7月 10

AIR for Android メモ GPU

このエントリーを含むはてなブックマークはてなブックマーク - AIR for Android メモ GPU Googleブックマークに追加 このエントリをつぶやくこのWebページのtweets

AIR for AndroidのGPUについて

・GPUの設定
設定事項が記述されているXMLファイルを書き換える
104行目の

<!-- <renderMode></renderMode> -->



<renderMode>gpu</renderMode>


に書き換える。

・cacheAsBitmap, cacheAsBitmapMatrixについて
ベクター画像(drawRectとかlineToなどで描いたグラフィック)は毎フレーム再描画されていて、この描画に掛かるコストが結構高いらしい。
そこでcacheAsBitmapをtrueにすると一度描いたグラフィックを保存しておいて再描画する必要がなくなる。
しかしcacheAsBitmapは回転、縮小、拡大には対応していなくて
回転、縮小、拡大をするようなグラフィックについてはcacheAsBitmapMatrixにnew Matrix()を代入することで対処できるそうです。

で、本当に軽くなるのか色々と実験

使用した実機:Google Nexus S

・実験1 長方形の描画、平行移動のみ
デモ

cacheAsBitmap:無効
cacheAsBitmapMatrix:無効
FPS:5~10

cacheAsBitmap:有効
cacheAsBitmapMatrix:無効
FPS:10

cacheAsBitmap:有効
cacheAsBitmapMatrix:有効
FPS:10

・実験2 長方形の描画、平行移動、回転
デモ

cacheAsBitmap:無効
cacheAsBitmapMatrix:無効
FPS:5~10

cacheAsBitmap:有効
cacheAsBitmapMatrix:無効
FPS:1

cacheAsBitmap:有効
cacheAsBitmapMatrix:有効
FPS:10

・実験3 画像、平行移動
デモ

cacheAsBitmap:無効
cacheAsBitmapMatrix:無効
FPS:12

cacheAsBitmap:有効
cacheAsBitmapMatrix:無効
FPS:8

cacheAsBitmap:有効
cacheAsBitmapMatrix:有効
FPS:8

・実験4 画像、平行移動、回転
デモ

cacheAsBitmap:無効
cacheAsBitmapMatrix:無効
FPS:10

cacheAsBitmap:有効
cacheAsBitmapMatrix:無効
FPS:1

cacheAsBitmap:有効
cacheAsBitmapMatrix:有効
FPS:8

まとめ
・ベクター画像にはcacheAsBitmap、cacheAsBitmapMatrixを有効にした方が高速
・Bitmapには無効にした方が高速
その他調べていて分かったこと
・Bitmapのサイズは2の累乗にした方がよい
・回転、縮小、拡大以外の変化があるベクター画像にはcacheAsBitmap、cacheAsBitmapMatrixは逆効果

ソース

package
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.ColorTransform;
	import flash.geom.Matrix;
	
	import flashx.textLayout.formats.BackgroundColor;
	
	
	public class GPUTest_fl extends Sprite
	{
		private var list:Vector.<Ball> = new Vector.<Ball>();
		private var canvas:Sprite = new Sprite();
		public function GPUTest_fl()
		{
			super();
			
			for(var i:int = 0; i < 1000; i++){
				var b:Ball = new Ball(Math.random()*stage.stageWidth, Math.random()*stage.stageHeight, Math.random()*50, Math.random()*50);
				list.push(b);
				addChild(b);
			}
			
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		
		private function onEnterFrame(e:Event):void{
			var i:int = list.length;
			while(i--){
				var b:Ball = list[i];
				b.update();
				if(b.x < -50 || b.x > stage.stageWidth+50){
					b.vx *= -1;
				}
				if(b.y < -50 || b.y > stage.stageHeight+50){
					b.vy *= -1;
				}
			}
		}
	}
}
import flash.display.Bitmap;
import flash.display.Sprite;
import flash.filters.GlowFilter;
import flash.geom.Matrix;

class Ball extends Sprite{
	[Embed(source="snow.png")]
	private var Img:Class;
	public var vx:Number, vy:Number, vr:Number;
	public function Ball(x:Number, y:Number, w:Number, h:Number){
		this.x = x;
		this.y = y;
		//		cacheAsBitmap = true;
		//		cacheAsBitmapMatrix = new Matrix();
		
		/*  実験3,4で使用
		var bmp:Bitmap = new Img();
		addChild(bmp);
		bmp.width = bmp.height = Math.random()*30+20;
		bmp.x = -bmp.width/2;
		bmp.y = -bmp.height/2;
		*/
		vx = Math.random()*10-5;
		vy = Math.random()*10-5;
		vr = Math.random()*20-10;
	}
	
	public function update():void{
		x += vx;
		y += vy;
//		rotation += vr;
	}
}

参考書

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次の HTMLタグおよび属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>