iOS - drawRect致内存增加

时间:2022-03-17 06:21:57

GPU VS CPU
iOS - 软件绘图

自定义“斑马线背景”View,重写drawRect绘制斑马线:
iOS - drawRect致内存增加

⚠️ 仅仅添加这一个View,内存就比正常增加了3~5M之间。

测试源代码:code - gitbub

一、导致内存增加的行为

重写drawRect

二、为什么重写drawRect会导致内存暴增

我们在 UIView 子类的 drawRect 函数中利用 Quartz2D 绘制图形,UIView 中的视图的内容是通过其控制的 CALayer 对象来绘制和渲染的,而在 CALayer 中显示图像的核心是 CALayer的 contents 属性。contents 默认接收一个 id 类型对象。contents 也称为寄宿图,我们可以重写 drawRect 对 contexts 直接进行绘制,在重写 drawRect 方法时,会先自动生成一个 contents (它的尺寸等于view.width * view.height * 设备分辨率)。

GPU VS CPU 中说明了CoreGraphics 绘制会增大内存开销,所以最好不要食用drawRect 或者 CALayerDelegate 方法。原因就是其必须创建一个寄存图片

三、如何解决或者如何替代drawRect方法

矢量绘图比CoreGraphics 更加高效

CAShapeLayer

  • 渲染快速,CAShapeLayer 使用硬件加速,绘制同一个图形会比CoreGraphics快很多。
  • 高效使用内存,CAShapeLayer 不需要像普通 CALayer 一样创建一个 contents 图形,所以无路画布多大,都不会占用很多内存。
  • 不会被图层边界裁剪掉
  • 不会被像素化