iOS 核心动画高效绘图.pdf

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
iOS 核⼼动画的⾼效绘图 ⾼效绘图 不必要的效率考虑往往是性能问题的万恶之源。——William Allan Wulf 在第12章 『速度的曲率』我们学习 何⽤Instruments来诊断Core Animation性能问题。 在构建⼀个iOS app 的时候会遇到很多潜在的性能陷阱,但是在本章我们将着眼于有关 绘制的性能问题。 软件绘图 术语绘图通常在Core Animation的上下⽂中指代软件绘图 (意即:不由GPU协助的绘 图)。在iOS 中,软件绘图通常是由Core Graphics框架完成来完成。但是,在⼀些必要 的情况下,相⽐Core Animation和OpenGL ,Core Graphics要慢了不少。 软件绘图不仅效率低,还会消耗可观的内存。CALayer只需要⼀些与⾃⼰相关的内 存:只有它的寄宿图会消耗⼀定的内存空间。即使直接赋给contents属性⼀张图 ⽚,也不需要增加额外的照⽚存储⼤⼩。 果相同的⼀张图⽚被多个图层作 为contents属性,那么他们将会共⽤同⼀块内存,⽽不是复制内存块。 但是⼀旦你实现了CALayerDelegate协议中的-drawLayer:inContext:⽅法或 者UIView中的-drawRect:⽅法 (其实就是前者的包装⽅法),图层就创建了⼀个 绘制上下⽂,这个上下⽂需要的⼤⼩的内存可从这个算式得出:图层宽*图层⾼*4字 节,宽⾼的单位均为像素。对于⼀个在 etina iPad上的全屏图层来说,这个内存量就 是 2048*1526*4字节,相当于12MB 内存,图层每次重绘的时候都需要重新抹掉内存然 后重新分配。 软件绘图的代价昂贵,除⾮绝对必要,你应该避免重绘你的视图。提⾼绘制性能的秘 诀就在于尽量避免去绘制。 ⽮量图形 我们⽤Core Graphics来绘图的⼀个通常原因就是只是⽤图⽚或是图层效果不能轻易地 绘制出⽮量图形。⽮量绘图包含⼀下这些: 任意多边形 (不仅仅是⼀个矩形) 斜线或曲线 ⽂本 渐变 举个例⼦,清单13.1 展⽰了⼀个基本的画线应⽤。这个应⽤将⽤户的触摸⼿势转换成 ⼀个UIBezierPath上的点,然后绘制成视图。我们在⼀个UIView⼦ 类DrawingView中实现了所有的绘制逻辑,这个情况下我们没有⽤上view controller 。但是 果你喜欢你可以在view controller 中实现触摸事件处理。图13.1是代 码运⾏结果。 清单13.1 ⽤Core Graphics实现⼀个简单的绘图应⽤ #im ort DrawingView .h @interface DrawingView () @ ro erty (nonatomic, strong) UIBezierPath * ath; @end @im lementation DrawingView - (void)awakeFromNib { //create a mutable ath self. ath = [[UIBezierPath alloc] init]; self. ath.lineJoinStyle = kCGLineJoinRound; self. ath.lineCa Style = kCGLineCa Round; ​ self. ath.lineWidth = 5; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //get the starting oint CGPoint oint = [[touches anyObject] locationInView :self]; //move the ath drawing cursor to the starting oint [self. ath moveToPoint: oint]; } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { //get the current oint CGPoint oint = [[touches anyObject] locationInView :self]; //add a new line segment to our ath

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档