【发布时间】:2012-01-17 14:39:23
【问题描述】:
我终于坐下来将我们的一些图形库转换为使用 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 上完成,是否有原因?
谢谢,
【问题讨论】:
-
您在 Instruments 中分析此代码时发现了什么?
-
我会试试@PeterHosey。在阅读了更多内容之后,我开始怀疑它是因为我要进出 GPU/VRAM。即,数据被复制到 GPU/VRAM,工作完成,将其复制回 RAM(UIImage),然后复制回 VRAM(显示 UIImage)。
-
@Shizam - 上传到 GPU 非常快,甚至可以在 10 毫秒左右的时间内完成从 GPU 中提取信息的
glReadPixels()调用,以便在 iPhone 4 上获得合适大小的图像. 这当然可以在 GPU 上比 CPU 快得多,所以那里一定有一些隐藏的开销。也许在 Core Image 的某个地方(可能往返于 CGImageRef)的 CPU 上进行了格式转换。正如 Peter 建议的那样,Time Profiler 可能会找出瓶颈所在。
标签: iphone ios ios5 core-graphics core-image