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




