我找不到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));
}
每次运行都使用相同的源图像。
我知道Core Image连接过滤器链。这是以某种方式被缓存?我可以预先缓存此操作,以便用户在首次启动应用时不会遇到性能问题吗?
这个让我发疯:(
答案 0 :(得分:6)
开销的一部分可能是图像库本身的加载。如果效果实现为像素着色器,则可能会在幕后进行编译步骤。
这种隐藏的成本是不可避免的,但您可以选择在更方便的时间进行。例如,当应用程序正在加载时。
我建议加载一个小图像(1x1像素)并在加载过程中对它应用一些效果,看它是否有帮助。
您可能还想尝试Apple官方论坛以获得回复。
答案 1 :(得分:-2)
有三种方法可以创建上下文来绘制outputImgae; contextWithOptions:
这是在GPU或CPu上创建的,它基于你的发展; contextWithEAGLContext:; contextWithEAGLContext:
选项:在GPU上创建;看看核心图像编程指南;