【问题标题】:Can I use contentScaleFactor to save memory safely?我可以使用 contentScaleFactor 安全地节省内存吗?
【发布时间】:2012-03-24 01:10:52
【问题描述】:

我有一个应用程序,其中一部分是显示图像网格。 每个 ImageView 是 200x150,但图像本身是 1024x768。 如果我尝试只设置这些图像,很快我就会收到内存警告,甚至可能会被杀死。

另一方面,如果在代码中调整这些图像的大小会耗费大量 CPU 资源并占用大量时间。

现在,我观看了一个“Apple WWDC”会议的视频,那里的人提到了 UIView 的 contentScaleFactor,它负责分配用于显示视图的实际位图内存量。

在文档中,他们只提到了比例因子大于 1 的情况,但我关心将其设置为小于 1 的值:

// Make sure not to divide by zero
if (image.size.width > 0 && image.size.height > 0)
{
    CGFloat widthRatio = self.imageView.frame.size.width / image.size.width;
    CGFloat heightRatio = self.imageView.frame.size.height / image.size.height;
    CGFloat aspectFitRatio = MAX(widthRatio, heightRatio);
    aspectFitRatio = MIN(1, aspectFitRatio);
    [self.imageView setContentScaleFactor:aspectFitRatio];
}

这样我的 imageView 将分配更少的内存。

我的问题是 - 我说的对吗? 它真的会节省内存吗? 将 contentScaleFactor 设置为

谢谢!

【问题讨论】:

    标签: iphone ios ipad uiview uikit


    【解决方案1】:

    恐怕这对帮助不大。问题是,UIView 保留了一个图像,无论其大小如何。因此,只要视图存在,图像就会占用 RAM。 contentScaleFactor 不会改变这个事实。为了真正减少内存占用,您必须在将图像分配给UIView 之前重新采样图像。

    但是,contentScaleFactor 确实会影响用于渲染的后备存储的大小。鉴于目前只有两类 iOS 设备,并且这些设备使用 1.02.0 比例因子,您可以在 Retina 设备上简单地将 contentScaleFactor 强制为 1.0。请注意,它不会对其他设备执行任何操作。

    【讨论】:

    • 图像对象没有那么大。它是消耗内存的渲染后备存储。例如,大小为 1024x768 的 jpg 图像需要 300kb 左右。这是因为 jpg 格式被压缩了。但是当你想显示这个图像时,每个像素都必须用自己的字节表示(至少),所以渲染这个图像所需的内存将是 1024x768 = 786kb。因此,减少后备存储内存占用应该会对总内存占用产生显着影响
    • @Avrahamshuk 最大的问题(它被认为是实现detail)是何时图像被解压缩。如果每次需要渲染的时候都解压,那么它消耗的内存很少,但是重绘的代价是非常大的。如果从磁盘读取时解压,则反之。我认为当前的实现涉及延迟加载(第一次绘制图像时解压缩图像)并将解压缩的图像保存在 RAM 中以便更快地重绘。但是,我可能是错的,这可能会在任何 iOS 版本中发生变化。
    • 你的假设是有道理的。因此,如果我可以确保在首次绘制图像之前设置 contentScaleFactor,我将节省大量内存。不过我还是不能接受你的回答……现在我来深入了解一下UIKit的绘制过程。
    • @Avrahamshuk 没问题。无论如何,我认为这个问题值得与 Instruments 进行几次讨论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    相关资源
    最近更新 更多