单元模块排除法找出引起掉帧的主要因素
场景:
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
遗留的问题
结论一二
解决播放器引起的掉帧问题(滑动过程中没有停止播放)