iOS性能优化

影响APP的底层机制,主要是CPU,GPU的占用率和 内存的使用率,

APP主线程在CPU中,计算显示内容,比如视图的创建,布局,图片解码,文件绘制等,计算完这些东西后交给GPU把结果提交到帧缓冲区去,等待下一次 垂直 信号到来时显示到屏幕上。由于垂直同步的机制,如果在一个 VSync 时间内,CPU 或者 GPU 没有完成内容提交,则那一帧就会被丢弃,等待下一次机会再显示,而这时显示屏会保留之前的内容不变。这就是界面卡顿的原因。

无论是CPU或GPU哪个阻碍了显示的流程都会造成掉帧的现象,在xcode里面也可以看到手机APP在调试模式下CPU和内存的使用情况。

一 CPU方面

从三个打的方面考虑,对象的创建,调整和销毁都会影响CPU的使用

对象的创建如果不处理事件,尽量使用轻量级的CALayer,xib或Storyboard会是这些创建的消耗大很多,经常使用的对象应该放到缓存里面重复利用,UIImage imageNamed适合重复使用的对象,initWithContentOfFile适合一次性使用的对象。

CALayer并不能够直接调整视图的属性,而是通过runtime,resolveInstanceMethod为对象临时添加一个方法,同时把对象的属性保存在一个字典里面,然后发送通知给代理,创建动画,UIView是CALayer的包装,对对象的属性调整时大于一般对象的属性,应该有immutable 的思想,另外重写drawreact方法也会带来很大性能的损耗,尽量避免视图层次过多的叠加和变动。React 有类似的思想,利用高效的算法,对比当前视图和之前视图的差异,然后做调整,当在移动开发时,

React Native的效果和原生的还是有一定的差距,特别是动画的使用上,做频繁的变动导致掉帧率变大。导航视图移动过慢。

对象的销毁一般是在主线程里面来进行的,也可以单独的放到后台线程里面进行。对应大量使用循环对象,可以使用autoreleasePool来管理。

对应布局的技术和调整,可以考虑用空间换时间的方式,让服务器返回图片的大小,避免默认图的固定大小造成的tableview刷新过多,尽量缓存tableview的高度,重复使用,对应复杂的视图,可以考虑用串行队列,将对象的创建和push的动作隔离开来,可以明显的增加视图的加载效率,尽量使用后台计算视图的显示数据

autolayout等技术使用在复杂布局上时,会产生严重的性能问题,应该避免使用,可以考虑ComponentKit、AsyncDisplayKit ,EZayout等框架,

对于文本的计算,可以使用coretext排版可以直接获取文本的高度,把计算高度的工作交给后台,coretext对象可以重复使用。

对应图片的绘制,可以使用CoreGraphic获取bitmap,用ImageIO直接解压图片

二 GPU方面

GPU 能干的事情比较单一:接收提交的纹理(Texture)和顶点描述(三角形),应用变换(transform)、混合并渲染,然后输出到屏幕上。通常你所能看到的内容,主要也就是纹理(图片)和形状(三角模拟的矢量图形)两类。

超大图片的使用会导致内存的暴涨,可以使用GPU加速的layer控制。

申明透明的view opaque 为1

CALayer 的 border、圆角、阴影、遮罩(mask),CASharpLayer 的矢量图形显示,通常会触发离屏渲染(offscreen rendering),而离屏渲染通常发生在 GPU 中。当一个列表视图中出现大量圆角的 CALayer,并且快速滑动时,可以观察到 GPU 资源已经占满,而 CPU 资源消耗很少。这时界面仍然能正常滑动,但平均帧数会降到很低。为了避免这种情况,可以尝试开启 CALayer.shouldRasterize 属性,但这会把原本离屏渲染的操作转嫁到 CPU 上去。对于只需要圆角的某些场合,也可以用一张已经绘制好的圆角图片覆盖到原本视图上面来模拟相同的视觉效果。最彻底的解决办法,就是把需要显示的图形在后台线程绘制为图片,避免使用圆角、阴影、遮罩等属性。可以考虑用画图的方式截取圆角。

比较高效的开源库有AsyncDisplayKit,拥有高效的异步绘制和渲染能力,最后,用 Instuments 的 GPU Driver 预设,能够实时查看到 CPU 和 GPU 的资源消耗。在这个预设内,你能查看到几乎所有与显示有关的数据,比如 Texture 数量、CA 提交的频率、GPU 消耗等,在定位界面卡顿的问题时,这是最好的工具。如果界面出现不明卡顿,可以监听主线程的runloop,监控到了卡顿现场,PLCrashReporter,它不仅可以收集Crash信息也可用于实时获取各线程的调用堆栈(http://www.tanhao.me/code/151113.html/)

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

推荐阅读更多精彩内容