Core Image在首次渲染时要慢很多倍

Kyl*_*tew 4 ios

我找不到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));
}
Run Code Online (Sandbox Code Playgroud)

运行时间

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

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

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

这个让我发疯:(

iso*_*one 6

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

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

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

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