0

私は現在、ios のペイント アプリに取り組んでいます。

NSMutableData バッファへの直接描画を使用し、次のようにブラシでブレンドを適用します。

- (void) combineColorDestination:(unsigned char*) dest source:(unsigned char*) src
{

const unsigned char sra     = ((unsigned char *)src)[3];
const float oneminusalpha   = 1.0f - (sra / 255.f);

int d[4];

for (int i=0;i<4;i++)
{
    d[i] = oneminusalpha * ((unsigned char *)dest)[i] +  ((unsigned char *)src)[i];

    if (d[i]>255)
        d[i] = 255;

    ((unsigned char *)dest)[i] = (unsigned char)d[i];
}

}

最適化のための提案はありますか?

以前は neo を使用しようとしましたが、修正できなかったバグがあります (境界ピクセルにバグがありました)。

私はこのようにピクセルを2つずつ繰り返していました:

uint8x8_t va = vld1_u8(dest);
uint8x8_t vb = vld1_u8(src);
uint8x8_t res = vqadd_u8(va,vb);
vst1_u8(dest, res);
4

1 に答える 1

2

提案?大丈夫。これらは、どのマルチメディア操作を行っていても有効であり、ケースにほとんど制限されないことに注意してください。

まず、NEON を実行する前に、コードを変更して、一連のピクセル (少なくとも行、できれば四角形) を一度に変更する関数 (またはメソッド、さらに悪いことに) を変更する関数を 1 つ持つようにする必要があります。 1ピクセルを変更し、何度も呼び出されます.どういうわけか、ブラシが1x1ピクセルしかないのではないかと疑っています.

第 2 に、列ループ (および最終的な行ループ) を除いて、分岐 (つまり、フロー制御構造) があってはなりません。いいえfor (i=0;i<4;i++); 4 つのチャネルのコードを順番に記述するだけです (必要に応じてマクロを使用します)。いいえif (d[i]>255); 代替手段としてそれを表現してください。dest[i] = (temp>255?255:temp);少なくとも、飽和を行うためのより効率的な方法に置き換えない場合は (減算、シフト、およびマスクを使用するトリックが存在します)。

3 つ目は、浮動小数点と整数の間の変換を避けることです。これは常に有効なアドバイスですが、float->int 変換は ARM では特に壊滅的です。整数を操作しているので、これはここで浮動小数点を前にすることを意味します。

そして、それができたら、驚いたことに、コードを高速化するだけでなく、実際に NEON の準備作業も完了しています。あちこちで浮動小数点と整数の間で変換しないでください。したがって、この時点で必要である場合にのみ、NEON について説明します。

于 2011-10-01T14:52:35.120 に答える