您的位置:首页 > 移动开发 > IOS开发

iOS的不同绘图系统

2016-05-04 10:39 337 查看
iOS主要的绘图系统有UIKit,Core Graphics(Quarts),Core Animation,Core Image和OpenGLES,每一个都能针对不同类型的问题起作用。

UIKit是这里面最高级的界面,是Objective-C中唯一的界面,他能用于轻巧地访问布局,组成,绘图,字体,图片,动画等,可以通过ui前缀来识别UIKit元素,比如UIView和UIBezierPath,UIKit也扩展NSString来利用方法简化文本绘制。

Core Graphics UIKit下的主要绘图系统,频繁用于绘制自定义视图,Core Graphics跟UIView和UIKit其他部分高度集成,Core Graphics数据结构和函数可以通过CG前缀来识别。

Core Animation提供了强大的2D和3D动画服务,它也与UIView高度集成。

Core Image提供了非常快的图片过滤方式,比如切图,锐化,扭曲和其他一些你能想象的变形效果。

OpenGL ES 主要用于编写高性能游戏。

UIKit和视图绘图周期

如果要改变视图的大小或显示,画一条线,或者改变一个对象的颜色,这些改变在屏幕上不会立刻显示出来。

所有的绘制都发生在主线程,只要代码运行在主线程,就没有东西可以绘制,这就是不要在主线程中执行长时间操作的一个原因。这不仅仅会阻碍绘制更新,还会阻碍事件处理(比如响应触摸事件),只要代码运行在主线程上,应用对于用户其实就是“功能挂起来的”。绘图事件实质是ios在有限的硬件上渲染复杂的绘图的功能,那么如何开始喝停止一个长时间操作的活动指示器呢?可以采用调用(dispath)或执行队列来将耗时的任务放在后台,同时创建在主线程中进行UIKit调用的代码。

简而言之,有一下的结论:

ios在运行循环(runloop)中整合所有的绘图请求,并一次将他们绘制出来。

不能在主线程中进行复杂的处理

不能在主线程之外的视图上下文中绘制,开发者需要检查每个UIKit方法以确保它没有主线程需求,只要不是在主视图上下文中绘制,一些UIKit方法是可以在后台线程中使用的。

视图绘制和视图布局

UIView将子视图的布局("重新排序")从绘图("显示")中独立出来,这对于最大程度地优化性能很重要,因此布局的成本通畅比绘制低,布局之所以成本低,是因为UIView的缓存通过GPU优化的位图进行绘图操作,使用GPU,可以使这些位图的移动,显示,隐藏,旋转,甚至变形和合并的成本非常低,如果对一个视图调用setNeedsDispaly方法,它就会被标记为“需要刷新的”,并且会在下一绘图周期中重新绘制,除非视图的内容真的会发生变化,否则不要调用它。

自定义视图绘制

视图可以通过子视图,图层或实现drawRect:方法来表现内容。通畅来说,如果实现了drawRect方法,那么就不要再混用图层了子视图了。即使这样做合法且有时会有帮助,大部分自定义绘图都是用UIKit或Core Graphic实现的。

2D绘图一般可以拆分成一下几个操作:

线条 路径 文本 图片 渐变

2D绘图并不能操作单独的像素,因为像素是依赖于目标的。可以从位图上下文中读取它,但无法使用UIKit或Core Graphics函数来直接作用于它。

UIKit和Core Graphics都使用"painter"绘图模型,这意味着每个命令都是依次绘制并在事件循环中在上一次绘图上叠加内容,在这个模型顺序是非常重要的,必须从底层开始向上绘制,每次调用drawRect:方法,都要对所有需要的区域进行绘制,在调用drawRect:方法时,绘图“画布”并不受到保护。

路径

UIKit包含了很多要比它的矩形绘制函数功能强大的绘图命令,她可以通过UIBezierPath绘制任意曲线和线条,贝塞尔曲线是使用了一些触电的线条或曲线的数学表示方式,一般情况下,开发者并不需要担心自己的数学水平,因为UIBezierPath拥有处理大部分常见路径的简单方法,通过这些路径可以快速的绘制大部分的UI元素形状。

优化UIView绘制

uiview 及其子类是高度优化的,可以的话,请尽量使用它们,而不要使用自定义绘图,优化UIVIEW的方法:

1 避免绘图

最快的绘图方法就是不绘图。

2 缓存和后台绘制

如果需要在绘图时做很多计算,请尽量利用缓存,在最低级别,你可以缓存需要的原始数据,这样就不必每次获取,除此之外,你可以缓存像CGFont或CGGradientt这样的对象,以便一次就能生成,这些缓存与与计算很多都可以在后台完成,你可能听说过,绘图只能在主线程上进行,不过这并非完全正确,一些UIKit函数必须在主线程上调用。

3 自定义绘图和预渲染
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: