gpt4 book ai didi

iOS UIImage存储格式、内存使用和编码/解码

转载 作者:行者123 更新时间:2023-11-28 08:50:44 25 4
gpt4 key购买 nike

iOS 如何存储从压缩数据(jpeg2000、png、jpg 等)加载的图像

示例:[UIImage imageWithData:pngData]
它是在内部存储实际编码字节并按需解压缩,还是永久解压缩为原始像素或其他格式?

最佳答案

我在 iPad 2 上创建了一个测试应用程序,它使用以下三种方法加载了 200 个 384x384 像素 jpeg2000 图像文件(值(value) 117,964,800 字节的原始像素):[UIImage imageNamed] , [UIImage imageWithContentsOfFile:][UIImage imageWithData] . jpeg2000 文件集是 100 个纹理,然后我将它们复制到额外的 100 个带有“复制”后缀的文件中,以查看 iOS 是否进行任何重复文件检查,它确实如此。更多关于下面的内容。

测试分两步完成

  • 只需加载图像并将它们存储在数组中。
  • 一个单独的按钮为每个图像创建 UIImageViews 并显示它们。

  • 结果如下:

    [UIImage imageNamed:]

    第一步:内存只增加了大约所有 jpeg2000 文件的总和(每个文件大约 50K,所以内存增加了大约 5 MB)。我假设此时没有复制重复文件,并且以某种方式被 iOS 合并,因为如果没有重复检查,此时内存将增加 10MB。

    第二步:内存显着增加(大约 200 MB),大概是因为图像被解码为 BGRA 格式以准备在 UIImageView 中显示。看起来在这个阶段没有重复过滤,并且为每个图像分配了单独的原始内存。我不知道为什么,但这比实际的原始像素内存使用量多出大约 80 MB。

    [UIImage imageWithContentsOfFile:]

    第一步:内存使用与 [UIImage imageNamed:] 相同,所以在这个阶段有重复过滤。

    第二步:内存使用量高达 130 MB。由于某种原因,这比 [UIImage imageNamed:] 小 70 MB .这个数字更接近 200 张图像的预期原始像素内存量。

    [UIImage imageWithData:]
    [NSData dataWithContentsOfFile:]首先使用。

    第一步:内存使用量为 15 MB。我假设这里没有重复过滤,因为这接近所有 jpeg2000 数据的总文件大小。

    第二步:内存使用量高达 139 MB。这超过了 [UIImage imageWithContentsOfFile:] ,但幅度不大。

    概括

    iOS 似乎引用了 UIImage 的压缩数据。使用上述三种方法加载,直到实际需要原始像素,此时将其解码。
    [UIImage imageNamed:]由于我所有的 ImageView 都引用了图像,因此从未释放内存。如果我错开加载并允许运行循环执行,它将释放未引用图像的内存。一个优点是重复 [UIImage imageNamed:]对同一图像的调用基本上是免费的。请勿将此方法用于 GUI 图像以外的任何内容,否则您可能会耗尽内存。
    [UIImage imageWithContentsOfFile:]行为类似于 [UIImage imageNamed:]直到需要原始像素之前的内存使用,此时由于某种原因它在内存使用方面效率更高。当 UIImage 被释放时,这个方法也会导致内存立即被释放。多次调用 [UIImage imageWithContentsOfFile:]具有相同文件似乎使用缓存副本,直到所有 UIImage的引用文件被释放。
    [UIImage imageWithData:]不进行缓存或重复检查,并始终创建新图像。

    我测试了与 PNG 文件相同的集合,imageNamed 和 imageWithContentsOfFile 的第 1 步结果显示使用的内存更少(大约 0.5 MB),而 imageWithData 显示了所有压缩的 PNG 文件的总和。我的猜测是 iOS 只是存储对文件的引用,并且在解码之前不会对它做任何其他事情。 PNG 的第 2 步结果是相同的。

    关于iOS UIImage存储格式、内存使用和编码/解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34272303/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com