我目前正在开发一个应用程序,它一个接一个地显示许多图像。不幸的是,我没有为此使用视频的奢侈,但是,我可以选择使用的图像编解码器。数据从服务器发送到应用程序,已经编码。
例如,如果我使用 PNG 或 JPEG,我可以使用[[UIImage alloc] initWithData:some_data]
. 当我使用原始字节数组或另一个必须首先解码为原始字节数组的自定义编解码器时,我必须创建一个位图上下文,然后使用CGBitmapContextCreateImage(bitmapContext)
它提供一个 CGImageRef,然后将其馈入[[UIImage alloc] initWithImage:cg_image]
. 这要慢得多。
上图(时间以秒为单位)是执行从 NSData 到 UIImage 的转换所需的时间。PNG、JPEG、BMP 和 GIF 都大致相同。Null 根本不打扰转换并返回 nil 。Raw 是使用位图上下文方法转换的原始 RGBA 字节数组。自定义的解压缩为原始格式,然后执行相同的操作。LZ4 是原始数据,使用 LZ4 算法压缩,因此它也通过位图上下文方法运行。
例如,PNG 图像只是经过压缩的位图图像。这种解压缩然后渲染比我渲染原始图像所花费的时间更少。iOS 必须在幕后做一些事情来加快速度。
如果我们查看转换每种类型需要多长时间以及绘制(到图形上下文)需要多长时间的图表,我们会得到以下信息:
我们可以看到大多数图像的转换时间非常不同,但绘制时间却非常相似。这排除了 UIImage 懒惰并仅在需要时转换的任何性能提升。
我的问题本质上是:我可以利用众所周知的编解码器的更快速度吗?或者,如果没有,是否有另一种方法可以更快地呈现我的原始数据?
编辑:为了记录,每当我得到一个新的 UIImage 时,我都会在另一个 UIImage 上绘制这些图像。可能有一种我愿意研究的更快的替代方案。但是,不幸的是,OpenGL 不是一种选择。
进一步编辑:这个问题相当重要,我想要最好的答案。在确保给出最佳答案的时间到期之前,不会颁发赏金。
最终编辑:我的问题是为什么解压缩和绘制原始 RGBA 数组比绘制 PNG 更快,例如,因为 PNG 必须解压缩为 RGBA 数组然后绘制。结果是它实际上更快。但是,这似乎只在发布版本中出现。调试版本没有为此优化,但在幕后运行的 UIImage 代码显然是优化的。通过编译为发布版本,RGBA 阵列图像比其他编解码器快得多。