我在iOS 4中调用CGContextDrawLayerAtPoint时遇到了一些性能问题,这些问题在以前版本的操作系统中似乎不存在。
我正在将一个从CGBitmapContextCreate创建的位图上下文中获取的图层复制到drawRect调用期间的视图上下文中。视图和位图大小相同。
位图是用:
创建的CGBitmapContextCreate(NULL, width, height, 8, width * 4, genericRGBSpace, kCGBitmapByteOrder32Host | kCGImageAlphaNoneSkipFirst);
指示我在CGContextDrawLayerAtPoint上花费的时间比在运行OS 3.2的设备上花费的时间多。事实上,堆栈跟踪表明以下堆栈跟踪占用了更高的时间百分比:
argb32_sample_argb32
argb32_image_mark
argb32_image
ripl_Mark
ripl_BltImage
RIPLayerBltImage
ripc_RenderImage
ripc_DrawLayer
CGContextDelegateDrawlayer
CGContextDrawLayerAtPoint
而在3.2下运行的相同代码显示
argb32_image_mark_rgb32
argb32_image
ripl_Mark
ripl_BltImage
ripc_RenderImage
ripc_DrawLayer
CGContextDelegateDrawLayer
CGContextDrawLayerAtPoint
时间百分比低得多。我不确定为什么在iOS 4上调用argb32_sample_argb32以及它正在做什么 - 将现有数据采样到新缓冲区?我不确定为什么这是必要的。视图和位图大小相同,并且未执行缩放。
对此有任何见解将不胜感激。
答案 0 :(得分:0)
嗯,没有人对此有任何见解,所以我会重述我们的理论以及我们最终做的事情。理论上说,由于iOS 4现在必须处理不同的屏幕分辨率,因此它采用了更为“通用”的方法进行blitting,并且效率低于它。
最后,它并不重要 - 它更慢,我们必须处理它。我们发现有些地方我们正在冗余地复制,所以我们能够减少我们必须做的复制量。这给我们带来了我们所需的速度。