美文网首页
重写drawRect导致的内存问题

重写drawRect导致的内存问题

作者: MxlZlh | 来源:发表于2017-12-01 14:05 被阅读77次

一、绘画只在UIView中执行,需要新建UIView的子类

二、重写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 图形,所以无路画布多大,都不会占用很多内存。
不会被图层边界裁剪掉
不会被像素化

原文地址:http://bihongbo.com/2016/01/03/memoryGhostdrawRect/
GitHub地址:https://github.com/bb-coder/BHBDrawBoarderDemo

相关文章

网友评论

      本文标题:重写drawRect导致的内存问题

      本文链接:https://www.haomeiwen.com/subject/btfwbxtx.html