赞
踩
在 VSync 信号到来后,系统图形服务会通过 CADisplayLink 等机制通知 App,App 主线程开始在 CPU 中计算显示内容,比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去,由 GPU 进行变换、合成、渲染。随后 GPU 会把渲染结果提交到帧缓冲区去,等待下一次 VSync 信号到来时显示到屏幕上。由于垂直同步的机制,如果在一个 VSync 时间内,CPU 或者 GPU 没有完成内容提交,则那一帧就会被丢弃,等待下一次机会再显示,而这时显示屏会保留之前的内容不变。这就是界面卡顿的原因。
从上面的图中可以看到,CPU 和 GPU 不论哪个阻碍了显示流程,都会造成掉帧现象。所以开发时,也需要分别对 CPU 和 GPU 压力进行评估和优化。
1、 通过工具检查
2、看代码分析
优化点:
优化点
改善前:无论是下拉加载数据,还是数据加载完毕往上滑动列表,都有明显掉帧和卡顿现象
改善后:往上滑动或者数据加载完毕再往下滑动,完全不会掉帧和卡顿
往下加载数据偶尔会出现掉帧现象。
分析可能的原因是往下滑动加载下一页数据时,接口数据回调回来后调用框架的CSCollectionViewDataManager类的addCardInstances方法在主线程耗时27ms左右导致掉帧。
单元模块排除法找出引起掉帧的主要因素
场景:
1、往下拉
2、往上(回)拉
前提:注释播放器play和stop逻辑;注释起播加速;
步骤
1、注释topview所有组件,只留下bottomview
测试滑动效果:
往下滑动时,仍然会掉帧
网上滑动,不掉帧
结论:
1、可能商品图片加载引起掉帧
2、加载新数据引起掉帧
进一步测试:注释商品图片加载代码
测试滑动效果:
往下滑动加载新数据,还是会有些许掉帧 —— 加载新数据有可能存在阻塞主线程的方法
往上滑动不掉帧
2、 放出_introView(图片和渐变背景先隐藏)
测试滑动效果:
往下滑动,加载新数据有些掉帧;
往上滑动,基本不掉帧;再次往下滑动,也基本不掉帧了;
3、 放出tagview(lottie先隐藏)
测试滑动效果:同上
4、 放出tagview的lottie
说明:
1、 lottie的url从config server取的,初始化控件的时候取一次
2、 lottie的创建(调用框架的方法,异步获取, 并开启了缓存(降级场景只能取到静态图?))
测试滑动效果:同上
5、 放出_introView的渐变背景
测试滑动效果:同上
6、 释放封面图预加载代码
测试滑动效果:同上; 感觉往下加载新数据时,卡顿更严重一些,等分析加载新数据卡顿原因时再进一步分析;
7、 释放goodsview图片
测试滑动效果:同上;
8、 释放_introView图片加载
测试滑动效果:
往下加载新数据会掉帧;
往上滑动也出现了偶尔掉帧;
9、重新隐藏_introView图片加载再测试一遍
测试滑动效果:往回拉时基本不掉帧。
得出结论:同时只显示一张图片时,往回拉基本不掉帧。增加一张图片往回拉出现掉帧。
10、只加载封面图,隐藏其他图片加载
测试滑动效果:同2
11、释放_introView图片加载
测试滑动效果:掉帧不明显
12、释放goodsview图片加载
测试滑动效果:往回掉帧
13、goods和intro的图片都预加载
Goods预加载前224b -> 预加载 14b
Intro预加载前104b -> 预加载 8b
接下来,逐步分析加载新数据掉帧原因
方法:从日志台打印的关键日志入手,找到往回拉和往下拉日志差别;找到了didTriggerPaging方法;从这个方法入手终于揪出了两个主线程耗时方法
1、addCardInstances 耗时20多ms
2、preHandleCardInstances 平均耗时4~6ms
遗留的问题
结论一二
解决播放器引起的掉帧问题(滑动过程中没有停止播放)
已解决:
未解决:
1、 =0时,不会从响应链中移除
2、更改默认是有动画的
3、 hidden隐藏性能更高
4、会影响自己和subview的透明度
1、UIView当有背景颜色时:并且背景颜色有透明度(透明度不为1时),将 opaque设置为YES性能较高。
2、UIVIew有背景颜色时:并且背景颜色的透明度为1,opaque的值不影 响性能。
3、UIVIew没有背景颜色时:opaque的值不影响性能。
参考文档
Instruments性能检测
Instruments性能检测 - 简书
Animation Hitch:
iOS 底层原理39:Instruments系列(三)Animation Hitches - 简书
iOS渲染流程和卡顿分析工具-Animation Hitches - 掘金
iOS 性能检测新方式——AnimationHitches - 知乎
iOS卡顿检测:
iOS卡顿检测 - 简书
UICollectionView复用:
UICollectionView缓存机制探究 - 简书
2016笔记——UICollectionView复用 - 简书
dispatch_sync_on_main_queue:
如何安全使用dispatch_sync - 简书
圆角设置:
iOS 设置圆角、指定位置圆角及 iOS 11圆角设置 - 简书
离屏渲染:
iOS 离屏渲染探究 - 掘金
iOS圆角的离屏渲染,你真的弄明白了吗 - 掘金
iOS 渲染原理解析:
iOS 离屏渲染原理及优化(很有参考价值):
[转] iOS离屏渲染原理及优化 · Tenloy's Blog
设置圆角性能测评:
卡顿原理和解决方案:iOS 深入理解列表卡顿原理和滑动优化方案_苹果手机上的列表滑动问题-CSDN博客
图片的渲染过程与优化(非常有用):iosiOS图片的渲染过程与性能优化 - 简书
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。