【发布时间】:2025-11-20 19:35:02
【问题描述】:
我目前正在开发一个应用程序,该应用程序一个接一个地显示许多图像。不幸的是,我没有为此使用视频的奢侈,但是,我可以选择使用的图像编解码器。数据从服务器发送到应用程序,已经编码。
例如,如果我使用 PNG 或 JPEG,我可以使用 [[UIImage alloc] initWithData:some_data] 将收到的数据转换为 UIImage。当我使用原始字节数组或另一个必须首先解码为原始字节数组的自定义编解码器时,我必须创建一个位图上下文,然后使用提供 CGImageRef 的CGBitmapContextCreateImage(bitmapContext),然后将其输入[[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 阵列图像比其他编解码器快得多。
【问题讨论】:
-
如果没有更多信息,无法深入回答这个问题。你到底在做什么(发布一些代码)?为什么从 NSData 到 UIImage 的转换与您相关(似乎您排除了最相关的部分,显示)?您如何衡量所需的时间?
-
我是否理解正确,您想找到通过网络发送图像、解压缩并在屏幕上显示它们而不在磁盘上缓存的最快方法?
-
可以假设我已经在设备上拥有图像。它们是原始 RGBA 字节数组。我想尽快把它变成 UIImage。
-
为什么将数据转换为与您相关的
UIImage?您是否知道在屏幕上显示UIImage所需的时间很大程度上取决于它的创建方式。您可能会找到创建UIImage的最快方法,但这不太可能是显示此图像的最快方法。 -
我没有意识到这一点。你有更多关于这方面的信息吗?
标签: ios objective-c uiimage cgbitmapcontextcreate