gpt4 book ai didi

objective-c - Objective C 提高 CIImage 过滤速度

转载 作者:太空宇宙 更新时间:2023-11-03 21:56:18 24 4
gpt4 key购买 nike

我编写了以下代码以将棕褐色滤镜应用于图像:

- (void)applySepiaFilter {
// Set previous image
NSData *buffer = [NSKeyedArchiver archivedDataWithRootObject: self.mainImage.image];
[_images push:[NSKeyedUnarchiver unarchiveObjectWithData: buffer]];


UIImage* u = self.mainImage.image;
CIImage *image = [[CIImage alloc] initWithCGImage:u.CGImage];
CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"
keysAndValues: kCIInputImageKey, image,
@"inputIntensity", @0.8, nil];
CIImage *outputImage = [filter outputImage];
self.mainImage.image = [self imageFromCIImage:outputImage];
}

- (UIImage *)imageFromCIImage:(CIImage *)ciImage {
CIContext *ciContext = [CIContext contextWithOptions:nil];
CGImageRef cgImage = [ciContext createCGImage:ciImage fromRect:[ciImage extent]];
UIImage *image = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
return image;
}

当我运行这段代码时,它似乎滞后了 1-2 秒。我听说 core image 比 core graphics 快,但我对渲染时间不以为然。我想知道这是否会在 CoreGraphics 或什至 OpenCV(在项目的其他地方使用)中处理得更快?如果没有,有什么方法可以优化此代码以使其运行得更快?

最佳答案

我几乎可以保证在 Core Graphics 中它会比使用 Core Image 慢,这取决于图像的大小。如果图像很小,Core Graphics 可能没问题,但如果你正在进行大量处理,它会比使用 GPU 渲染慢得多。

Core Image 非常快,但是,您必须非常清楚发生了什么。 Core Image 的大部分性能下降是由于上下文的设置,以及将图像复制到 Core Image 或从 Core Image 复制图像。除了复制字节,Core Image 还可以在图像格式之间进行转换。

您的代码每次都执行以下操作:

  • 创建一个 CIContext。 (慢)
  • 从 CGImage 中获取字节并创建 CIImage。
  • 正在将图像数据复制到 GPU(慢)。
  • 正在处理棕褐色滤镜(快速)。
  • 将结果图像复制回 CGImage。 (慢)

这不是达到最佳性能的良方。来自 CGImage 的字节通常位于 CPU 内存中,但 Core Image 希望使用 GPU 进行处理。

Getting the Best Performance 中提供了性能注意事项的极好引用。 Core Image 文档:

  • Don’t create a CIContext object every time you render. Contexts store a lot of state information; it’s more efficient to reuse them.
  • Evaluate whether you app needs color management. Don’t use it unless you need it. See Does Your App Need Color Management?.
  • Avoid Core Animation animations while rendering CIImage objects with a GPU context. If you need to use both simultaneously, you can set up both to use the CPU.

  • Make sure images don’t exceed CPU and GPU limits. (iOS)

  • Use smaller images when possible. Performance scales with the number of output pixels. You can have Core Image render into a smaller view, texture, or framebuffer. Allow Core Animation to upscale to display size.

  • Use Core Graphics or Image I/O functions to crop or downsample, such as the functions CGImageCreateWithImageInRect or CGImageSourceCreateThumbnailAtIndex.

  • The UIImageView class works best with static images. If your app needs to get the best performance, use lower-level APIs.

  • Avoid unnecessary texture transfers between the CPU and GPU. Render to a rectangle that is the same size as the source image before applying a contents scale factor.

  • Consider using simpler filters that can produce results similar to algorithmic filters. For example, CIColorCube can produce output similar to CISepiaTone, and do so more efficiently.

  • Take advantage of the support for YUV image in iOS 6.0 and later.

如果您需要实时处理性能,您将希望使用 CoreImage 可以将其输出渲染到的 OpenGL View ,并将图像字节直接读入 GPU,而不是从 CGImage 中提取。使用 GLKView 并覆盖 drawRect: 是获得 Core Image 可以直接渲染到的 View 的相当简单的解决方案。将数据保存在 GPU 上是获得 Core Image 最佳性能的最佳方式。

尽量重用。保留 CIContext 用于后续渲染(如文档所述)。如果您最终使用 OpenGL View ,这些也是您可能希望尽可能多地重复使用的东西。

您还可以通过使用软件渲染获得更好的性能。软件渲染将避免复制到 GPU 或从 GPU 复制。 [CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer: @(YES)}] 然而,这在实际渲染中会有性能限制,因为 CPU 渲染通常比 GPU 渲染慢。

因此,您可以选择难度级别以获得最佳性能。最佳性能可能更具挑战性,但一些调整可能会让您的用例达到“可接受的”性能。

关于objective-c - Objective C 提高 CIImage 过滤速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36925068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com