AIR Native Extension(ANE)の速度を試す

今回はANEを試してみました。

ANEとは、AIRからデバイスのネイティブコードと連携できる仕組みのことで、今回のテストではAIRから複雑な計算処理だけをネイティブコードに任せて、AIRを爆速で動かしてみます。

今回のテスト内容は↓この記事をかなり参考にさせていただきました。ありがとうございます。

Air Native Extension(ANE) 実行速度実験2 + 画像処理 » Every day is Carnival

テスト内容は、

(1) 動画を毎フレームごとに
(2) 1200×800px のBitmapDataにdrawして
(3) 緑色以外の部分だけグレースケールに変換する

というものです。

(3) の部分だけをネイティブコードにお任せします。
元の動画はこちらを使いました。

ネイティブコード(C++)で計算してみた動画です。環境はWindows7です。

FPSは 30 出ています。
これ以上BitmapDataのサイズが大きくなると、フレームレートが落ちてくるのですが、2010年に買ったノートPC(Core i7)なので、最新のデスクトップPCだともう少し大きなBitmapDataも処理できるはずです。

C++での画像変換処理のコードはこんな感じです。(参考blog記事に少し手を加えただけです。)

FREObject grayScale(
    FREContext ctx,
    void* funcData,
    uint32_t argc,
    FREObject argv[]
) {

	FREByteArray ba;
	int32_t w, h;

	FREAcquireByteArray(argv[0], &ba);
	FREGetObjectAsInt32(argv[1], &w);
	FREGetObjectAsInt32(argv[2], &h);

	uint32_t *p, *data = (uint32_t*)(ba.bytes);
	int r, g, b;

	p = data;

	for(int y = 0; y < h; ++y) {
	    for(int x = 0; x < w; ++x) {
	        r = *p >> 8 & 0xff;
	        g = *p >> 16 & 0xff;
	        b = *p >> 24 & 0xff;
			if(r>g || b>g){
				r = g = b = (r+g+b)/3;
			}
	        *p = b << 24 | g << 16 | r << 8 | 0xff;
	        p++;
	    }
	}

	FREReleaseByteArray(argv[0]);
	return FREObject();
}

そして、比較用にAS3だけで同じ画像変換処理を行ったものはこちらです。

FPSは 2 しか出ていません。
AS3には暴力的な計算処理みたいです。
AS3での画像変換処理のコードはこんな感じです。

private function grayScale(bmpData:BitmapData):void{
	bmpData.lock();
	var color:uint;
	var r:uint;
	var b:uint;
	var g:uint;
	for(var i:int = 0; i < bmpData.height; i++){
		for(var j:int = 0; j < bmpData.width; j++){
			color = bmpData.getPixel(j, i);
			r = color & 0xFF;
			g = (color>>8) & 0xFF;
			b = (color >> 16) & 0xFF;
			if(r>g || b>g){
				r = g = b = (r+g+b)/3;
			}
			bmpData.setPixel(j,i, (b<<16)|(g<<8)|r);
		}
	}
	bmpData.unlock();
}

ネイティブコードの方がかなり早いことが実感できました!
次は、openFreamworksのライブラリ等とも連携してみたいなー!

Post a comment

※承認されるまではコメントは表示されません。

Trackbacks

URL: http://b.i-tach.com/wp-trackback.php?p=746