CoreImage,iOS5和速度,为什么CoreImage如此缓慢?

3

我终于开始将我们的一些图形库转换为使用CoreImage来渲染图像(例如混合两个图像),我已经让它工作了,但速度很慢(iOS5.01 iPhone 4S)。我认为CoreImage的承诺是硬件加速,这是我正在做的:

        CIImage *intputBackgroundImage = [[CIImage alloc] initWithCGImage:backgroundImageRef];
    CIImage *inputImage = [[CIImage alloc] initWithCGImage:inputImageRef];

    CIFilter *multiply = [CIFilter filterWithName:@"CIMultiplyBlendMode"];
    [multiply setDefaults];

    [multiply setValue:intputBackgroundImage forKey:@"inputBackgroundImage"];
    [multiply setValue:inputImage forKey:@"inputImage"];

    CIImage *result = multiply.outputImage;
    CIContext *ctx = [CIContext contextWithOptions:nil];

    CGImageRef resultRef = [ctx createCGImage:result fromRect:CGRectMake(0, 0, imgFrame.size.width, imgFrame.size.height)];
    UIImage *resultImage = [UIImage imageWithCGImage:resultRef];
    CGImageRelease(resultRef);

它可以工作,我得到了一张将inputImage混合到backgroundImage中的图片,但是实际上这比我只使用CoreGraphics和CGContext()做的方式要慢。有没有办法检查这个工作是否不是在GPU上完成的,有没有原因导致不是呢?

谢谢。


1
当您在Instruments中对此代码进行分析时,您发现了什么? - Peter Hosey
1
我会尝试一下@PeterHosey。在进一步阅读后,我开始怀疑是因为我正在GPU/VRAM之间来回切换。也就是说,数据被复制到GPU/VRAM中,进行处理,然后被复制回RAM(UIImage),再被复制回VRAM(显示UIImage)。 - Shizam
2
@Shizam - 上传到GPU非常快,即使在iPhone 4上对于一个相当大的图像进行glReadPixels()调用以从GPU中获取信息也可以在10毫秒左右完成。这肯定比CPU更快地在GPU上完成,因此必须在其中某个地方存在一些隐藏的开销。也许在Core Image中的某个地方正在执行CPU上的格式转换(可能是从和到CGImageRef)。正如Peter所建议的那样,时间分析器可能会找出瓶颈在哪里。 - Brad Larson
1个回答

1

需要重新渲染的东西最适合使用ci,或者需要进行多个过滤器的东西。

目前速度较慢,因为项目必须从CPU内存复制到GPU内存(iOS上没有OpenGL统一内存支持)。

这意味着,由于只执行一个效果,所以由于双重复制,需要更长的时间。


我认为这就是我的问题要点,我需要弄清如何使用“CAEAGLLayers”。 - Shizam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接