iOS 性能优化_CPU 消耗优化

CPU 资源消耗原因和解决方案

  1. 对象创建

原因:对象的创建会分配内存、调整属性,甚至还有文件读写等操作,比较消耗 CPU 资源。那么使用轻量级的对象,可能会对性能有所优化。比如 CALayer 比 UIView 要轻量许多,那么不需要响应触摸事件的对象,用 CALayer 比较合适。如果创建的对象不涉及到 UI 界面刷新,那就尽量放到后台线程去创建。但是可惜的是包含有 CALayer 的控件,都只能在主线程进行创建和操作。通过 sb 创建视图对象时,其资源消耗要比直接使用代码创建对象要大的多。在性能敏感的界面中,sb 不是一个好的选择。

解决方案:
(1) 尽量推迟对象创建的时间,并把对象的创建分配到多个任务中去(推荐使用懒加载)。
(2) 如果对象可以复用,而且复用的代价比释放、创建新对象要小,那么这类对象要尽量放在一个缓存池中复用。

  1. 对象调整

原因:对象调整也是经常消耗 CPU 资源的地方,在这里特别说明一下 CALayer,CALayer 内部并没有属性,当调用属性方法的时候,它内部是通过运行时为对象临时添加一个方法,并把对应的值保存在内部的一个字典当中,同时还会通知 delegate、创建动画等,非常消耗资源。UIView 的关于显示的相关属性(frame/bounds/transform)等实际上都是 CALayer 的属性映射而来的,所以对 UIView 的这些属性进行调整的时候,消耗的资源要远大于一般的属性。

解决方案:当视图层次调整的时候,消耗的资源要远大于一般的属性,所以在优化性能时,应该尽量避免调整视图层次、添加和移除视图。

  1. 对象销毁

原因:对象销毁虽然消耗资源不多,但累计起来也是不容忽视的。通常当容器类持有大量对象时,其销毁时的资源消耗也就相当明显。

解决方案:对象的释放也尽量放到后台线程中去执行。这里有个坑:把对象捕捉到 block 中,然后扔到后台去随便发个消息以避免编译器警告,就可以让对象在后台销毁了。

  1. 布局计算

视图布局的计算是 App 中常见的消耗 CPU 资源的地方,如果能在后台线程中提前计算好视图布局,并对布局进行缓存的话,那么这个地方就不会出现任务性能问题了。

不论通过何种技术对视图进行布局,最终都会落到 UIView.frame/bounds/center 等属性的调整上,所以尽量提前计算调整好布局,在需要时一次性调整好对应属性,而不要多次、频繁的计算和调整这些属性。

  1. Autolayout

Autolayout 是苹果集成的技术,在大部分情况下也可以很好的提高开发效率,但是 Autolayout 对复杂视图来说常常会产生严重的性能问题。随着视图的增长, Autolayout 带来的 CPU 消耗会呈指数级上升。如果不想手动调整 frame 等属性,可以使用第三方 SDK。

  1. 文本计算

如果一个界面中包含大量的文本,文本的宽高计算会占用很大一部分资源,并且不可避免。如果没有特殊要求,可以参考下 UILabel 内部的实现方式:[NSAttributeString boundingRectWithSize:context:]来计算文本宽高,用 [NSAttributrString drawWithRect:options:context:] 来绘制文本。尽管这两个方法性能不错,但是扔需要放到后台线程以避免阻塞主线程。

如果你使用 CoreText 绘制文本,那就可以先生成 CoreText 排版对象,然后自己计算,并且 CoreText 对象还可以保留以供稍后绘制使用。

  1. 文本渲染

屏幕上能看到的所有文本内容控件,包括 UIWebView,在底层都是通过 CoreText 排版,绘制为 bitmap 图显示的。常见的文本控件(UILabel、UITextView等),其排版和绘制都是在主线程中进行的。当显示大量文本的时候,CPU 的压力会非常大。对此解决方案只有一个,那就是自定义文本控件,用 TextKit 或者最底层的 CoreText 对文本异步绘制。尽管这实现起来非常麻烦,但带来的优势也非常大,CoreText 对象创建好以后,能直接获取文本宽高等信息,避免了多次计算(调整 UILabel 时计算一遍,UILabel 绘制时内部在计算一遍);CoreText 占用内存较少,可以缓存下来以备多次渲染。

  1. 图片的解码

当你用 UIImage 或者 CGImageSource 的那几个方法去创建图片的时候,图片数据并不会立刻解码。图片设置到 UIImageView 或者 CALayer.contents 中去,并且 CALayer 被提交到 CPU 前,CGImage 中的数据才会得到解码,这一步是发生在主线程的,并且不可避免。如果想绕开这个机制,常见的做法就是在后台线程先把图片绘制到 CGBitmapContent 中,然后从 Bitmap 直接创建图片。目前常见的网络图片库都有这个功能

  1. 图片的绘制

图片的绘制通常是指那些以 CG 开头的方法把图像放到画布中,然后从画布中创建图片并显示的一个过程,最常见的地方就是 [UIView drawRect:] 里面了。由于 CoreGraphic 方法通常都是线程安全的,所以图像的绘制可以很容易的放到后台线程去执行,一个简单的异步绘制的过程大概如下(实际情况会复杂的多,但过程原理大致一样):

- (void) display {
        dispatch_async(backgroundQueue, ^{
        CGContextRef ctx = CGBitmapContextCreate(...);
        // draw in context...
        CGImageRef img = CGBitmapContextCreateImage(ctx);
        CFRelease(ctx);
        dispatch_async(mainQueue, ^{
        layer.contents = img;
        });
    });
 }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容