iOS性能优化 - 卡顿优化

成像过程:

  • 在iOS中是双缓冲机制,有前帧缓存、后帧缓存

成像原理:

  • 发出垂直同步信号,告诉屏幕即将显示一帧数据;
  • 发出水平同步信号,显示一行一行的数据,直到填充到整个屏幕为止。

产生卡顿的缘由

  • 如图:垂直同步信号的发射频率是固定的,信号发出,表明着即将显示数据;
  • 若是期间,CPU或GPU有一步耗时较长(第3帧的渲染),垂直信号已发出,可是GPU尚未渲染完,那么就是显示渲染好的第2帧数据,连续显示相同的帧,就形成了画面卡顿。
  • 第3帧会在第4次同步信号过来时再显示。

因此解决卡顿的主要思路:

  • 尽量减小CPU、GPU的资源消耗。(保证刷帧率60FPS.)

CPU优化:

  • 尽可能用轻量级的对象,好比用不到事件处理的地方,能够考虑使用CALayer取代UIView;git

  • 不要频繁地调用UIView的相关属性,好比frame、bounds、transform等属性,尽可能减小没必要要的修改;github

  • 尽可能提早计算好布局,在有须要时一次性调整对应的属性,不要屡次修改属性;缓存

  • Autolayout会比直接设置frame消耗更多的CPU资源;性能优化

  • 图片的size最好恰好跟UIImageView的size保持一致;bash

  • 控制一下线程的最大并发数量;并发

  • 尽可能把耗时的操做放到子线程:oop

    1. 图片处理(解码、绘制);
    2. 文本处理(尺寸计算、绘制):
// 文字计算
    [@"text" boundingRectWithSize:CGSizeMake(100, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:nil context:nil];
    
    // 文字绘制
    [@"text" drawWithRect:CGRectMake(0, 0, 100, 100) options:NSStringDrawingUsesLineFragmentOrigin attributes:nil context:nil];
复制代码

GPU优化:

  • 尽可能避免短期内大量图片的显示,尽量将多张图片合成一张进行显示;布局

  • GPU能处理的最大纹理尺寸是4096x4096,一旦超过这个尺寸,就会占用CPU资源进行处理,因此纹理尽可能不要超过这个尺寸;post

  • 尽可能减小视图数量和层次;性能

  • 减小透明的视图(alpha<1),不透明的就设置opaque为YES;

  • 尽可能避免出现离屏渲。


卡顿检测

思路:

  • 平时所说的“卡顿”主要是由于在主线程执行了比较耗时的操做;

  • 能够添加Observer到主线程RunLoop中,经过监听RunLoop状态切换的耗时,以达到监控卡顿的目的。

  • 第三方:LXDAppMonitor


iOS性能优化:

相关文章
相关标签/搜索