Core Image编程指南翻译七(获得最佳性能)

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上下文构建自己的工作流。

你可能感兴趣的:(Core Image编程指南翻译七(获得最佳性能))