【问题标题】:Why does image in xcode takes up 50x more space during runtime than the actual size为什么 xcode 中的图像在运行时占用的空间比实际大小多 50 倍
【发布时间】:2015-05-19 00:52:40
【问题描述】:

我正在编写一个 iphone 应用程序并且正在使用几个大图像。其中一张图片是一个 .png 文件,大小小于 1mb。但是,在运行时调试器说它占用了 50mb 的空间。我正在使用 UIImageView 对象通过 Interface Builder 放置图像。

问题是,为什么要占用这么多内存,有没有办法在不占用这么多空间的情况下使用图像?

【问题讨论】:

  • 它可能未压缩地存储在内存中,例如原始位图。 PNG是压缩的,如果它是一个“简单”的图像,即使是像素级的“大”图像也可以压缩成非常小的文件。例如1024 x 1024 @ 24bit 图像需要 3meg 的 ram 来表示,但纯白色的 1k x 1k 图像仍然可以节省到磁盘上的 5k。

标签: ios xcode memory-management uiimageview


【解决方案1】:

Marc B 的评论是正确的。

你把它弄反了。 “在 Xcode 中”(在正在运行的程序中)不会比“实际大小”多 50 倍 内存。

磁盘上的文件被压缩,并且比图像在内存中占用的空间要少得多。 实际大小是内存中的大小,磁盘上的大小是压缩格式保存,但不能绘制到屏幕上。

要在屏幕上渲染图像,它需要每个像素使用 3 或 4 个字节(红色、绿色、蓝色,有时还有一个 Alpha 通道),并且不进行压缩。因此,如果您有一个 1000x1000 像素的图像,将其加载到内存中需要 400 万字节的内存。如果将其保存到磁盘,则不同的文件格式会使用不同级别的压缩来保存该数据。一种简单的方案是 RLE,即游程编码。在该方案中,相同颜色的连续字节使用特殊代码写入(例如,“在此处保存 500 个纯蓝色像素”,尽管除非图像是使用绘图程序生成的,否则很少有大面积的颜色完全相同。 RLE 对于照片或扫描几乎一文不值。)

其他压缩方案可实现更高级别的压缩。一些压缩方案是“有损”的(这意味着您在压缩然后解压缩图像后返回的图像与起始图像并不完全相同。)JPEG 压缩是有损方案的一个示例。在 JPEG 压缩中,您可以调整压缩级别。更高级别的压缩会产生更小的文件,但生成的图像看起来不太好,因为丢失的数据量越来越大。

无论采用何种压缩方案,图形硬件都需要内存中完整的每像素 4 字节才能进行绘制。

附:我的一个小烦恼:Xcode 是一个开发环境(编辑器、编译器、调试器、链接器等)。您的图像不是“在 Xcode 中”绘制的。它由您碰巧使用 Xcode编译的程序在iOS或Mac OS中呈现。

(因此,当人们谈论为什么“Xcode”以某种方式运行他们的代码时,它会让经验丰富的开发人员畏缩,并让你听起来很无知。我不想刻薄 - 只是让你知道。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 2020-04-16
    • 2013-09-18
    • 2022-01-14
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多