Core Image提供了许多用于创建图像,上下文和渲染内容的选项。您如何选择完成任务取决于:
- 您的应用需要多长时间执行一项任务
- 您的应用是否适用于静态或视频图像
- 是否需要支持实时处理或分析
- 色彩保真度对您的用户有多重要
您应该阅读性能最佳实践,以确保您的应用程序尽可能高效地运行。
性能最佳实践
遵循这些做法以获得最佳性能:
- CIContext每次渲染时都不要创建对象。
上下文存储了大量的状态信息; 重用它们更有效。
- 评估您的应用是否需要色彩管理。除非您需要,否则不要使用它。看看你的应用需要色彩管理吗?
- 在CIImage使用GPU上下文渲染对象时避免使用Core Animation动画。
如果您需要同时使用两者,则可以将两者都设置为使用CPU。
- 确保图像不超过CPU和GPU限制。
CIContext对象的图像大小限制因Core Image是使用CPU还是GPU而异。使用方法inputImageMaximumSize和检查限制outputImageMaximumSize。
- 尽可能使用较小的图像。
性能随输出像素数量而变化。您可以将Core Image渲染为较小的视图,纹理或帧缓冲区。允许Core Animation升级以显示大小。
-
使用Core Graphics或Image I / O函数进行裁剪或缩减采样,例如函数CGImageCreateWithImageInRect或CGImageSourceCreateThumbnailAtIndex。
-
在UIImageView类的工作最好的静态图像。
如果您的应用需要获得最佳性能,请使用较低级别的API。 -
避免CPU和GPU之间不必要的纹理传输。
-
在应用内容比例因子之前,渲染到与源图像大小相同的矩形。
-
考虑使用更简单的过滤器,它可以产生类似于算法过滤器的结果。
例如,CIColorCube可以产生类似于CISepiaTone的输出,并且可以更有效地完成。
- 利用iOS 6.0及更高版本中对YUV图像的支持。
相机像素缓冲区本身就是YUV,但大多数图像处理算法都需要RBGA数据。在两者之间进行转换需要付出代价。Core Image支持从CVPixelBuffer对象读取YUB 并应用适当的颜色转换。
options = @ {(id)kCVPixelBufferPixelFormatTypeKey:
@(kCVPixelFormatType_420YpCbCr88iPlanarFullRange)};
您的应用需要色彩管理吗?
默认情况下,Core Image会将所有滤镜应用于浅色线性色彩空间。这提供了最准确和一致的结果。
转换为sRGB和从sRGB转换会增加过滤器的复杂性,并要求Core Image应用这些等式:
rgb = mix(rgb.0.0774,pow(rgb * 0.9479 + 0.05213,2.4),step(0.04045,rgb))
rgb = mix(rgb12.92,pow(rgb * 0.4167)* 1.055 - 0.055,step(0.00313,rgb))
在以下情况下考虑禁用颜色管理
- 您的应用需要绝对最高的性能。
- 夸大的操作后,用户不会注意到质量差异。
要禁用颜色管理,请将kCIImageColorSpace密钥设置为null。如果您正在使用EAGL上下文,还要在创建EAGL上下文时将上下文颜色空间设置为null。请参阅使用CoreImage上下文构建自己的工作流。
网友评论