从视图设置、缓存、像素对齐以及图层应用来优化绘图速度,使用预渲染图形避免应用程序过于膨胀
iOS主要的绘图系统有UIKit、Core Graphics(Quartz)、Core Animation、Core Image 、OpenGL ES
-
UIKit 最高级界面,是OC中唯一的界面。能够轻松的访问布局、组成、绘图、字体、图片、动画等。元素以UI作为前缀。
-
Core Graphics (也称Quartz2D) UIKit下的主要绘图系统,频繁用于绘制自定义视图。数据结构和函数以CG作为前缀。
-
Core Animation 提供强大的2D、3D动画服务。
-
Core Image 于iOS 5中出现的Mac技术。提供非常快的图片过滤方式,比如切图、锐化、扭曲和其他你能想象的变形效果
-
OpenGL ES 用于编写高性能游戏(特别是3D游戏)

所有的绘制都发生在主线程,这也是不要将耗时操作放在主线程的原因之一。而且必须理解一点,绘制并不是实时发生的,有些操作只会给视图打上标记,绘制发生在方法完成后。
在后台线程绘图的风险:对于UIKit来说,绘图不是线程安全的。在后台修改视图会导致未定义的行为,包括绘制出错、崩溃。
视图的绘制与布局
布局(重新排列):使用GPU对位图进行移动、隐藏、显示、旋转、变形、合并的成本都非常低
一个视图调用setNeedsDisplay会被标记为“需要刷新”,并将在下一次绘制周期中被重绘,非必要尽量不要手动调用。UIKit视图自动管理重绘操作,因此这里讨论的多为自定义视图。
旋转或滚动设备,UIKit会自动调用setNeedsDisplay,会逐个调用layoutSubviews。所以覆盖layoutSubviews方法可以避免视图的重绘,提升流畅度。
只要在drawRect方法中不考虑bounds,那么屏幕旋转时一般也不会出现问题
反锯齿
-
坐标尽量使用整型,或者.5,因为在视网膜屏幕下,一个点位代表两个像素点。
-
尽量不要使用setCenter,而是使用setFrame,因为center可能会影响 像素对齐
-
设置字体大小尽量奇数
透明、不透明、隐藏
-
alpha:屏幕上没有真正的透明,alpha决定的是视图信息在屏幕上的表现(“着色”)
-
opaque: 不会实际升高、降低透明度,仅用于绘图系统的优化,标记为opaque = 向系统承诺不透明,可以忽略覆盖在视图下的绘制。特别适用于滚动视图的优化(类似的属性有clearContextBeforDrawing)
-
hidden表示根本不会绘制,也没有动画效果
网友评论