iOS上CGBitmapInfo值的性能表现

4
我正在UIView的drawRect中绘制CGBitmapContext的片段。 为了确保性能最佳,最好使用哪些CGBitmapInfo枚举值? 目前我正在使用kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big,但我还看到了这个stackoverflow问题片段,它提供了一种替代方法:为什么这段代码比天真的方法解压UIImage要好得多?
// makes system don't need to do extra conversion when displayed.
kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little

我的CGBitmapContext是可变的,因此用户可以在上面绘制,添加图像等。

据我所知,第二组选项更快。但是你能使用UIGraphicsBeginImageContextWithOptions创建位图上下文,并且不必担心这些细节吗? - yurish
我的CGBitmapContext是可变的,这意味着用户可以在其上绘制、添加图像等等,然后所有这些都需要使用UIView drawRect显示在屏幕上。 - jjxtra
@yurish,你能给我指一下第二个方法为什么更快的文档吗? - jjxtra
我记得有一次在苹果的WWDC视频中,他们演示了一个简单的绘图应用程序,该应用程序将绘图的一部分缓存在UIImage中。可能是WWDC 2012“优化2D图形和动画性能”,但我不确定。至于文档 - 抱歉,我不知道是否有其他地方记录了这个。我在苹果开发者论坛上问了类似的问题,答案是AlphaFirst或AlphaNoneSkipFirst,以及LittleEndian或HostEndian(预乘)。 - yurish
我发现kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little对我的应用程序很有效,我记得读过它是为iPhone硬件优化的...但我不记得在哪里看到的。 - pizzafilms
1个回答

4

我用kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32BigkCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little进行了测试,分析工具向我展示了它们之间稍微不同的代码路径。

kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little直接拷贝内存,而kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big需要通过一个转换函数。

这对我在CGBitmapContext中画路径并调用setNeedsDisplayInRect:显示在屏幕上所花费的总时间几乎没有影响(即使在iPod 4上也是如此)。而且由于总体时间基本相同,因此我选择kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big

编辑 我切换回kCGBitmapByteOrder32Little以便与其他iOS框架(如AVFoundation)兼容,并且由于性能没有影响。


你的总时间测量中包括将位图从一种格式转换为另一种格式的时间吗? - yurish
是的,总毫秒数非常接近(可能相差10-20)。也许我会再次进行分析并发布确切的时间。 - jjxtra
你如何测量转换时间?如果我理解正确,这种转换是在核心动画事务提交时完成的。setNeedsDisplayInRect:只是标记视图以进行重绘,绘制本身稍后在运行循环周期中发生。 - yurish
分析器会分解每个函数调用所占的百分比(即使是 iOS 框架调用)。在我使用两种位图信息进行手绘时,我只需选择了1秒钟的时间片段。 - jjxtra

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