vDSP 是IOS提供一系列加速处理算法。。在优化时可以考虑应用一二。。。
1、在项目中加入Accelerate.framework库
点开项目属性->Build Phases->Link Binary With Libraries->+ Accelerate.framework;
2、在应用的类头文件加上引用
#include <Accelerate/Accelerate.h>
3、查找对应函数应用
所有函数可以在该文档查找 vDSP Reference.
以下通过对图片的叠加算法进行测试....
//无vDSP叠加算法 void NormalEx( BYTE *InputPtr, BYTE *CompositePtr, floatrat,int width,int height) { for(int j=0;j<height;j++) { for(int i=0;i<width;i++) { InputPtr[BLUE] = (1 - rat) * InputPtr[BLUE] + rat * CompositePtr[BLUE]; InputPtr[GREEN] = (1 - rat) * InputPtr[GREEN] + rat * CompositePtr[GREEN]; InputPtr[RED] = (1 - rat) * InputPtr[RED] + rat * CompositePtr[RED]; InputPtr+=4; CompositePtr+=4; } }
//应用vDSP叠加算法 void NormalEx( BYTE *InputPtr, BYTE *CompositePtr, float rat,int width,int height) { int count=width*height; // alloc space for our dsp arrays float * srcAsFloat = (float*)malloc(count*sizeof(float)); float * comAsFloat = (float*)malloc(count*sizeof(float)); float inrat=1 - rat; for (int i=1; i<4; i++) { //转成float数组 vDSP_vfltu8(InputPtr+i,4,srcAsFloat,1,count); vDSP_vfltu8(CompositePtr+i,4,comAsFloat,1,count); //乘法 vDSP_vsmul(srcAsFloat, 1, &inrat, srcAsFloat, 1, count); vDSP_vsmul(comAsFloat, 1, &rat, comAsFloat, 1, count); //相加 vDSP_vadd(srcAsFloat, 1, comAsFloat, 1, srcAsFloat, 1, count); // 转回byte vDSP_vfixu8(srcAsFloat, 1, InputPtr+i, 4,count); } free(srcAsFloat); free(comAsFloat); }
4、总结
vDSP在实际应用需要转化成float或者double型处理....对于简单的算法而已会更加耗时(如:灰度算法)
实际应用在需要批量重复简单操作的算法中会有显著提速效果............