Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 用于图像处理的arm asm/neon优化_Ios_Uiimage_Arm_Neon - Fatal编程技术网

Ios 用于图像处理的arm asm/neon优化

Ios 用于图像处理的arm asm/neon优化,ios,uiimage,arm,neon,Ios,Uiimage,Arm,Neon,我目前正在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 / 2

我目前正在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];
}

}

建议?好吧请注意,无论您在做什么多媒体操作,这些都是有效的,并且几乎不限于您的情况

首先,在你做NEON之前,你应该改变你的代码,让它有一个可以同时改变一组像素的函数(至少一行,一个矩形,如果可以的话),而不是一个改变一个像素并被多次调用的函数(或方法,甚至更糟):不知怎的,我怀疑画笔只有1x1像素

其次,除了列循环(以及最终的行循环)之外,不应该有分支(即流控制结构)。对于(i=0;i255),无
;将其表示为另一种选择:
dest[i]=(temp>255?255:temp)至少,如果不是用一种更有效的饱和方法来代替它(存在使用减法、移位和遮罩的技巧)

第三,避免浮点和整数之间的任何转换;这始终是有效的建议,但浮点->整数转换在ARM上尤其具有破坏性。因为你在操作整数,这意味着前面提到了浮点


一旦你做到了这一点,令人惊讶的是,除了让你的代码更快之外,你实际上已经为NEON做了准备工作:NEON只有在你一次处理一堆像素,如果没有分支,如果你没有在浮点和整型之间进行转换的话,它才是非常有用的。因此,只有到那时,我们才会讨论NEON,如果在这一点上有必要的话。

您是否在iOS 4.0上,使用加速框架是可能的?我是,请提供更多详细信息为什么不使用CoreGraphics层在硬件上为您进行混合?这将比您自己开发的未优化代码更快。在2个月前的帖子中,我做了一些优化#define FASTCOMBINE temp=(oneminssrcalpha*((unsigned char)dest)[I])+((unsigned char*)src)[I]*255;\温度=温度>>8;\温度=(温度>255)?255:temp;\((无符号字符*)dest)[i]=(无符号字符)temp;\i++;静态内联void combinecollordensition(unsigned char dest,unsigned char*src){const unsigned char sra=((unsigned char*)src)[3];const unsigned char oneminussrcalpha=255-sra;unsigned int temp;unsigned int i=0;FASTCOMBINE FASTCOMBINE FASTCOMBINE}
uint8x8_t va = vld1_u8(dest);
uint8x8_t vb = vld1_u8(src);
uint8x8_t res = vqadd_u8(va,vb);
vst1_u8(dest, res);