UITableView的性能优化

屏幕显示图像的原理

计算机系统中CPU 计算好显示内容提交到GPU,GPU渲染完成后将渲染结果放入帧缓冲区中,随后视频控制器会按照VSync信号逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器显示

  • 界面卡顿的原因
    在VSync信号到来后,系统图形服务会通过CADisplayLink等机制通知App,App主线程开始在CPU中计算显示内容,比如视图的创建,布局计算图片解码,文本绘制等,随后CPU会将计算好的内容提交到GPU去,由GPU进行变换,合成,渲染。随后GPU会把渲染结果提交到帧缓冲区去,等待下一次VSync信号到来时显示到屏幕上,由于垂直同步的机制,如果在一个VSync时间内,CPU或者CPU没有完成内容提交,则那一帧就会被丢弃,等待下一次机会在显示,而这时显示屏会保留之前的内容不变,这就是界面卡顿的原因
离屏渲染的触发方式

设置以下属性时都会触发离屏绘制:
shouldRasterize(光栅化)
masks(遮罩)
shadows(阴影)
edge antialiasing(抗锯齿)
group opacity(不透明)
复杂形状设置圆角等
渐变

解决tableView滑动的时候卡顿的问题:

  • 使用不透明的视图,不透明的视图可以提高渲染的速度
  • 不必重复创建不必要的cell,
UITableViewCell高度计算优化(FDTemplateLayoutCell)
self.tableView.rowHeight = 88;

对于定高需求的表格,强烈建议使用这种(而非下面的)方式保证不必要的高度计算和调用

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    // return xxx
}

需要注意的是,实现了这个方法后,rowHeight 的设置将无效。所以,这个方法适用于具有多种 cell 高度的 UITableView

  • FDTemplateLayoutCell
    FDTemplateLayoutCell 的高度预缓存是一个优化功能,它要求页面处于空闲状态时才执行计算,当用户正在滑动列表时显然不应该执行计算任务影响滑动体验
  • 空闲RunLoopMode
    当用户正在滑动UIScrollView时,RunLoop将切换到 UITrackingRunLoopMode接受滑动手势和处理滑动事件,此时,其他的Mode(除 NSRunLoopCommonModes 这个组合 Mode)下的事件将全部暂停执行 ,来保证滑动的优先处理
  • 用RunLoopObserver找准时机
    注册 RunLoopObserver 可以观测当前 RunLoop 的运行状态,并在状态机切换时收到通知:
    1. RunLoop开始
    2. RunLoop即将处理Timer
    3. RunLoop即将处理Source
    4. RunLoop即将进入休眠状态
    5. RunLoop即将从休眠状态被事件唤醒
    6. RunLoop退出
UITableView 优化历程

测试环境 iphone6s iOS10.2

  1. 首先是发现卡顿
 _tableView.estimatedRowHeight = 80;
 _tableView.rowHeight = UITableViewAutomaticDimension;
[_tableView registerNib:[UINib nibWithNibName:@"TagCell" bundle:nil] forCellReuseIdentifier:CellID];
cell图片切圆角
    [_iconImage yy_setImageWithURL:url placeholder:nil options:YYWebImageOptionShowNetworkActivity  | YYWebImageOptionAllowBackgroundTask   completion:^(UIImage * _Nullable image, NSURL * _Nonnull url, YYWebImageFromType from, YYWebImageStage stage, NSError * _Nullable error) {
        UIImage * rediusImage = [image imageByRoundCornerRadius:image.size.height/2];
        _iconImage.image = rediusImage;
    }];
UITableView的性能优化_第1张图片
屏幕快照 2017-09-08 上午10.11.08.png

一个单样式的TableView,FPS基本都低于55

参考链接:

UIKit性能调优
iOS 保持界面流畅的技巧

你可能感兴趣的:(UITableView的性能优化)