【问题标题】:Sudden memory spike while using an UIImage for CGContextSetFillColorWithColor将 UIImage 用于 CGContextSetFillColorWithColor 时突然出现内存峰值
【发布时间】:2011-10-31 20:17:57
【问题描述】:

我正在使用图像来填充当前图形上下文中的颜色,使用以下语句:

CGContextSetFillColorWithColor(aContext,[[UIColor colorWithPatternImage:[UIImage imageNamed:kRunnerGradientedBackgroundImage]] CGColor]);

这个语句突然将我的内存使用量从 1.3 MB 增加到 5.6 MB。如果我释放 UIImage 对象,那么它会下降到 1.3 MB,但由于图像对象的保留计数已经是 0,我不能这样做。

有什么建议可以控制这种突然的内存峰值吗?

【问题讨论】:

  • 嗯,@autoreleasepool { YOUR CODE GOES HERE } ?
  • autoreleasepool 也无济于事。它使内存保持高价值。

标签: iphone ios cocoa-touch uikit core-graphics


【解决方案1】:

模式数据必须加载到内存中才能使用。没有解决这个问题。你可以尝试一个更小的模式。完成图案绘制后,还可以尝试将上下文的填充颜色设置回简单的纯色。

添加:当您在其中绘制图案或图像时,图形上下文本身也可能变得更大(以保存图案图像所需的所有像素)。尝试移除并释放包含图形上下文的 UIView 或 CGLayer。

【讨论】:

  • 尝试将填充颜色重置为 [[UIColor clearColor] CGColor] 但没有帮助。
【解决方案2】:

kRunnerGradientedBackgroundImage 有多大,它是什么格式的?如果是 PNG,它是否有不必要的 alpha 通道?正如 hotpaw2 所提到的,图案图像应尽可能小,然后 UIKit 将为您处理平铺或拉伸。可以使用PNGCRUSH 缩小尺寸吗?

另一种方法是使用CGGradientCAGradientLayer 通过CoreGraphics/CoreAnimation 以编程方式创建渐变。

见:

【讨论】:

    【解决方案3】:

    我已删除图像,现在使用代码绘制渐变。这将内存峰值减少了 4.5 MB。

    【讨论】:

      猜你喜欢
      • 2013-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多