iOS 核心动画学习笔记(2)- 绘制图层

矢量图形

1,-》在touch事件中, 记录UIBezierPath,
-》setNeedsDisplay刷新view, drawRect方法中用path绘画

2,-》用CAShapeLayer,touch事件中国年, 获取UIBezierPath,设置layer的path。CAShapeLayer会依照path绘制图形

脏矩形

1,-》在touch事件中,记录下来每一个Point,
-》setNeedsDisplay刷新view,drawRect方法中用UIImage什么的drawInRect:方法,在对应的这些点上绘制图形。

2,-》在touch事件中,记录下来每一个Point,
-》setNeedsDisplayInRect 刷新区域。

异步绘制

CATiledLayer,drawsAsynchronously

隐式绘制

光栅化(缓存)

离屏渲染

圆角、图层蒙版、阴影(没有缓存)
CAShapeLayer path 用UIBezierPath创建路径
CAShapleLayer contentsCenter 创建可伸缩图片
shadowPath 创建阴影路径

混合和过度绘制

gpu会放弃绘制那些完全被其他图层遮挡的像素,计算一个图层是否被遮挡,相当复杂并且会消耗处理器资源。
同样, 合并不同图层的重叠像素, 即混合, 消耗的资源也是相当大的。
因此不要使用透明图层,尽量减少混合行为。
1, 给视图的backgroundColor设置一个固定的,不透明的颜色。
2, 设置opaque属性为YES

减少图层数量

在做图层优化之前, 你需要确定不是在创建一些不可见的图层, 何为是不可见的图层:
1, 图层在屏幕边界之外, 或是在父图层边界之外。
2, 完全在一个不透明图层之后, alpha是1的图层后面,被完全覆盖了的。
3, 完全透明的图层,即将一个图层alpha设置0,它就是不可见的。
CoreAnimation非常擅长处理对视觉效果无意义的图层,就是它会直接忽略绘制这些不可见的像素。

减少图层数量的方法:
1,处理成千上万个图层时
-》不要一次性实例化所有layer的实例, 计算可视区域,在区域之外的图层就不创建了, 也就是说用懒加载的方式加载完所有要用的视图。
-》 处理相似View或Layer时, 使用对象池存储已经创建的实例,仅当在池中获取View或Layer为空时,在给池子创建新的。

2,CoreGraphics 绘制
如果需要一个富文本的画面, 有UIImageView,UILabel等等, 各种图层和嵌套,生成一个庞大的图层树。
我们可以做一个单一的View, 然后重写drawRect方法,在drawRect中绘制。这样就避免了图层树的分配和操作问题。

3,renderInContext方法--将图层树转为一张图片
用CALayer的renderInContext方法, 可以将图层和自图层,创建一个快照,输出到CoreGraphics上下文,
然后得到一个图片, 他可以直接显示在UIImageView中, 或者作为layer的contents。

总结

软件绘图 是CoreGraphics框架来完成。
CoreGraphics比Core Animation和 OpenGL 效率慢。

效率低, 消耗内存大。
CoreAnimation框架的CALayer的contents,只需要一些鱼自己相关的内存
寄宿图绘消耗一定的内存空间, 直接给contents赋值,并不需要增加额外的照片存储大小。
如果相同的照片,赋给多给layer的contents,内存是公用的。而并不是复制多个图片的内存。

CALayerDelegate协议 drawLayer:inContext:
UIView中的drawRect:方法 ,它是前者的封装

图层就会创建一个绘制上下文, 这个上下文需要的大小的内存可以从这个公式算出来:
图层宽* 图层高 * 4 字节
宽的单位为像素 对于一个 204815264 12M大小了
图层每次重绘的时候,都需要抹除内存, 重新分配内存,重新绘制。

所以软件绘图 代价很昂贵。 除非绝对必要, 应该要避免重回视图。

参考:
https://zsisme.gitbooks.io/ios-/content/chapter15/inexplicit-drawing-text.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • Core Animation其实是一个令人误解的命名。你可能认为它只是用来做动画的,但实际上它是从一个叫做Laye...
    小猫仔阅读 3,683评论 1 4
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,461评论 6 30
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 5,092评论 5 13
  • 一、CAShapelayer 我们知道可以不使用图片情况下利用CGpath去构建任意形状的阴影。其实我们也可...
    小猫仔阅读 1,420评论 0 5
  • 灼热炙烤的马路 一眼望不到尽头 光着屁股的孩童 肆意着满脸的通红 树下乘凉的老人 佝偻着满头的白发 西瓜地里的瓜农...
    宋哇哇阅读 536评论 6 13