4

我找不到任何来自 Apple 的文档来解释为什么这段代码根据运行次数而以不同的速度运行。

- (void)speedTest2:(CIImage*)source {
    NSTimeInterval start = CFAbsoluteTimeGetCurrent();

    CIFilter* filter = [CIFilter filterWithName:@"CIColorInvert"];
    [filter setValue:source forKey:kCIInputImageKey];

    CGImageRef cgImage = [_context createCGImage:filter.outputImage fromRect:source.extent];
    UIImage* output = [UIImage imageWithCGImage:cgImage];
    if (cgImage)
        CFRelease(cgImage);
    _source.image = output;

    NSLog(@"time: %0.3fms", 1000.0f * (CFAbsoluteTimeGetCurrent() - start));
}

运行时间

  • 全新应用安装 - 首次调用方法 = 206 毫秒
  • 应用程序重新启动 - 首次调用方法 = 61 毫秒
  • 第二次调用方法 (3rd, 4th, ...) = 14ms

每次运行都使用相同的源图像。

我知道 Core Image 连接过滤器链。这是否以某种方式被缓存?我可以预先缓存此操作,以便用户在首次启动应用时不会遇到性能问题吗?

这个让我抓狂:(

4

2 回答 2

6

一部分开销可能是图像库本身的加载。如果效果是作为像素着色器实现的,那么很可能在幕后进行编译步骤。

这种隐性成本是不可避免的,但您可以选择在更方便的时候进行。例如,当应用程序正在加载时。

我建议加载一个小图像(1x1 px)并在加载过程中对其应用一些效果,看看它是否有帮助。

您可能还想尝试 Apple 官方论坛以获得回复。

于 2012-12-07T20:05:24.630 回答
-2

有三种方法可以创建上下文来绘制 outputImgae;contextWithOptions:这基于您的设备在 GPU 或 CPU 上创建;contextWithEAGLContext:; contextWithEAGLContext:选项:在 GPU 上创建;查看核心图像编程指南;

于 2012-12-05T11:38:21.823 回答