博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[iOS Animation]-CALayer 绘图效率-异步绘制
阅读量:7024 次
发布时间:2019-06-28

本文共 930 字,大约阅读时间需要 3 分钟。

hot3.png

异步绘制

UIKit的单线程天性意味着寄宿图通畅要在主线程上更新,这意味着绘制会打断用户交互,甚至让整个app看起来处于无响应状态。我们对此无能为力,但是如果能避免用户等待绘制完成就好多了。

针对这个问题,有一些方法可以用到:一些情况下,我们可以推测性地提前在另外一个线程上绘制内容,然后将由此绘出的图片直接设置为图层的内容。这实现起来可能不是很方便,但是在特定情况下是可行的。Core Animation提供了一些选择:CATiledLayer和 drawsAsynchronously 属性。

CATiledLayer

我们在第六章简单探索了一下CATiledLayer。除了将图层再次分割成独立更新的小块(类似于脏矩形自动更新的概念),CATiledLayer还有一个有趣的特性:在多个线程中为每个小块同时调用-drawLayer:inContext:方法。这就避免了阻塞用户交互而且能够利用多核心新片来更快地绘制。只有一个小块的CATiledLayer是实现异步更新图片视图的简单方法。

drawsAsynchronously

iOS 6中,苹果为CALayer引入了这个令人好奇的属性,drawsAsynchronously属性对传入 -drawLayer:inContext: 的CGContext进行改动,允许CGContext延缓绘制命令的执行以至于不阻塞用户交互。

它与CATiledLayer使用的异步绘制并不相同。它自己的 -drawLayer:inContext: 方法只会在主线程调用,但是CGContext并不等待每个绘制命令的结束。相反地,它会将命令加入队列,当方法返回时,在后台线程逐个执行真正的绘制。

根据苹果的说法。这个特性在需要频繁重绘的视图上效果最好(比如我们的绘图应用,或者诸如UITableViewCell之类的),对那些只绘制一次或很少重绘的图层内容来说没什么太大的帮助。

总结

本章我们主要围绕用Core Graphics软件绘制讨论了一些性能挑战,然后探索了一些改进方法:比如提高绘制性能或者减少需要绘制的数量。

转载于:https://my.oschina.net/u/2438875/blog/507545

你可能感兴趣的文章
oracle12 se1和se2,小屏党的最终执念,12Mini和SE2,到底谁更值得入手?
查看>>
include top.php,Php 安全错误 Top 7
查看>>
oracle itl槽,事务槽(ITL)
查看>>
Redis中使用Lua脚本的开发思路
查看>>
重新审视美国爱因斯坦计划(2016)
查看>>
微信公众平台小程序开放公测
查看>>
【VMC实验室】在QCloud上创建您的SQL Cluster(3)
查看>>
发一个经典的Flask-SQLAlchemy使用场景
查看>>
企业shell常见面试题及企业实战案例深入浅出讲解
查看>>
VMware Workstation 12-虚拟机-批量创建-快照-批量创建恢复
查看>>
Oracle 变量绑定与变量窥视合集系列一
查看>>
只要3分钟,Python生成器原理详解
查看>>
51CTO梦想的摇篮【我与51CTO一“七”成长】
查看>>
db2数据库的schema和user
查看>>
知乎引流实操:日吸200精准粉丝玩法分享
查看>>
KMS客户端出现0xC004F074错误的解决方法
查看>>
浅谈如何通过自媒体渠道实现赚钱的途径与方法?
查看>>
老男孩的学道,教道实践经!
查看>>
从ORA-00374错误看运维工作的规范性
查看>>
十分详细的DHCP服务工作原理剖析
查看>>