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のライブラリ等とも連携してみたいなー!