我正在编写一个iphone应用程序并使用了几个大图像。其中一个图像是.png文件,其中< 1MB。但是,在运行时,调试器说它占用了50mb的空间。我使用UIImageView对象通过Interface Builder放置图像。
问题是,为什么占用这么多内存并且有没有办法在不占用太多空间的情况下使用图像?
答案 0 :(得分:2)
马克B的评论是正确的。
你已经倒退了。在Xcode"中,它不会占用50x 更多内存" (在正在运行的程序中)比实际大小"。
磁盘上的文件已压缩,占用的内存比内存中的图像少得多。 实际尺寸是内存中的尺寸,磁盘上的尺寸是用于保存的压缩格式,但不能将其绘制到屏幕上。
要在屏幕上渲染图像,它需要使用每像素3或4个字节(红色,绿色,蓝色,有时是alpha通道)而不进行压缩。因此,如果您有一个1000x1000像素的图像,将其加载到内存中需要400万字节的内存。如果将其保存到磁盘,则不同的文件格式使用不同级别的压缩来保存该数据。一个简单的方案是RLE,运行长度编码。在该方案中,相同颜色的连续字节用特殊代码写入(例如"在这里保存500像素的纯蓝色,"尽管除非图像是使用绘图程序生成的,否则很少有大面积区域完全相同的颜色.RLE对于照片或扫描来说几乎毫无价值。)
其他压缩方案实现了更高的压缩级别。一些压缩方案是有损的" (这意味着压缩后再返回的图像然后解压缩图像与起始图像完全相同。)JPEG压缩是有损方案的一个例子。在JPEG压缩中,您可以调整压缩级别。较高级别的压缩会产生更小的文件,但生成的图像看起来并不好,因为丢失的数据量越来越大。
无论压缩方案如何,图形硬件在绘制之前都需要内存中每个像素完整的4个字节。
P.S。我的一个小小的烦恼:Xcode是一个开发环境(编辑器,编译器,调试器,链接器等)。您的图像不是在Xcode"中绘制的。它是在iOS或Mac OS中通过一个程序呈现的,您可以使用> Xcode编译。
(所以当人们谈论为什么" Xcode"以某种方式运行他们的代码时,它会让经验丰富的开发人员感到畏缩,让你听起来无知。我不打算做出意思 - 只是让他们你知道。)