屏幕显示图像的原理
计算机系统中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 的运行状态,并在状态机切换时收到通知:- RunLoop开始
- RunLoop即将处理Timer
- RunLoop即将处理Source
- RunLoop即将进入休眠状态
- RunLoop即将从休眠状态被事件唤醒
- RunLoop退出
UITableView 优化历程
测试环境 iphone6s iOS10.2
- 首先是发现卡顿
_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;
}];

一个单样式的TableView,FPS基本都低于55
参考链接:
网友评论