- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)