本文转载自:http://inzaghi.cn/?p=197
1、 在代理方法中做了过多的计算占用了 UI 线程的时间
2、同上
3、Cell 中 view 的组织复杂
关于第一点,首先要明白 tableview 的代理(这里指 datasource 和 delegate 的那套方法,下同)方法的调用顺序,和时机。对于一般的应用会有如下顺序:
1、向代理要 number Of Rows。
2、对于每行向代理要 height For Row At Index Path。
3、向代理要 当前屏幕可见的 cell For Row At Index Path 。(实测显示4寸屏的手机会取 屏幕显示数量+2,3.5寸屏同4寸屏数量,虽然3.5寸屏可显示的cell 数量要小于 4寸屏!)
4、然后 cell 就显示出来了。
tableView:heightForRowAtIndexPath:
很多人都把优化的重点放到了 cell for row at indexpath 那个方法里了,在这里尽可能的少计算,但是却忽略了另一个很轻松就能提升加载时间的方法 :

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

Table View 在每次 reload data 时都会要所有 cell 的高度!这就是说你有一百行 cell,就像代理要100次每个cell 的高度,而不是当前屏幕显示的cell 的数量的高度!虽然在 iOS 7 下多了计算 cell 高度的方法,但是减少 计算高度时的时间,对于提升加载 Table View 的速度有非常明显的提高!

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
(**iOS 7专用**)

但是有人说了,我早听别人说了,reloadData 方法尽量不要调用,我插入新行都用 insertRowsAtIndexPaths:withRowAnimation: 删除也用 delete 那个,这个总行了吧?!
这样也不能忽略 height For Row At Index Path 这个回调的重要性。因为在每次插入或者删除一行后同样需要调用一遍 所有行 的这个回调方法!是所有行!你没看错,所有只是简单的减少一个代理方法的计算量,就可以明显的提升加载速度。
对于提升 tableView:heightForRowAtIndexPath: 计算量,就是尽可能的让这个方法的计算复杂度为 O(1),就是只是简单的从数组中取一个值,然后返回!
也许有人又要问了,我的应用都是动态的高度,就像微博那样的,不定数量的文字,可能还有图片,大小也不固定,这些怎么返回固定的高度啊?
我指的固定高度不是 row 的高度都一样那种固定,而是让在 tableView:heightForRowAtIndexPath: 这个回调里取这个高度的时间是近乎固定的。
对于高度的计算,还有个小细节需要注意,就是如果 row 的高度都一定,那就删除代理中的这个 tableView:heightForRowAtIndexPath: 方法,设置 Table View 的 rowHeight 属性,相似的 numberOfRowsInSection: 系列的方法,我就不都写出来了。苹果的文档里介绍这样也可以减少了调用时间。
现在回归正题。对于 cell 高度不固定的,传统的方法是为 cell 写个计算行高的类方法,传入那些动态的元素(文字,图片等),然后返回计算后的高度。在 tableView:heightForRowAtIndexPath: 中调用这个方法,填入需要的参数计算cell 高度。这当然没有什么问题,只是要是计算量很复杂,你每次 reloadData ,光计算行高就要花去 rowCount * 单行高评价计算时间,想想有100行,你不定期的需要 reloadData 或者 insert(delete) row。。。。解决办法就是:
用 “空间换时间”
将计算行高的时间提前到从服务器搂回数据的时候,计算完了高度一并写回数据库,别告诉我你在主线程里阻塞式的处理网络请求。。。。面壁思过去吧,别浪费了 GCD,NSOperationQueue的青春。最先想到的还是 NSThread 的同学,证明你已经老了。。。现在几乎大部分的多线程操作都不需要用到 NSThread 和 runloop了。
tableView:cellForRowAtIndexPath:
说完了计算 cell 行高的优化,现在来谈 tableView:cellForRowAtIndexPath: 回调的优化。优化思路同上,也是通过预处理减少在这个回调中的计算时间。这个回调重点谈的是对图片异步加载的优化。
图片异步加载无非就是在这个方法里发起异步请求,图片加载完后根据 UIImageView 的引用设置图片。有经验的程序员可能会使用 懒加载 的方式减少快速滑动时因为网络请求过于频繁与切换线程显示图片造成的卡顿。这里还有个问题,拿回来的图片一定和最后显示的大小不一样,有时候偷懒,直接设置 image view 的 contentMode 属性要 image view 自己 压缩。这是一个很取巧的方法,但是对 table view 的滚动速度也会造成 不容忽视 的影响。对图片变形需要对图片做 transform ,每次压缩图片都要对图片乘以一个变换矩阵,如果你的图片很多,这个计算量是不同忽视的。
优化建议:从网络搂回来图片后先根据需要显示的图片大小切成合适大小的图,每次只显示处理过大小的图片,当查看大图时在显示大图。如果服务器能直接返回预处理好的小图和图片的大小更好。
使用 Instrument 的 Core Animation 模板可以查看图片的压缩情况。如图:
Core Animation 模板
Instrument 中的 Core Animation 模板只有在调试真机时才有,调试模拟器上的应用没有这个模板!!!但是可以在模拟器的 Debug 菜单下找到这些调试选项。
切记:调试应用性能一定要用真机,Mac 的性能完爆 iPhone,所有不要说我的应用在模拟器上调试时不卡啊!模拟器只能模拟 iOS 软件的运行环境,不能模拟硬件性能!
Color Misaligned Images
这些选项对设备的所有应用有效,也就是说你不需要选择 target 就能调试 它(方便竞品分析 :)!
对于 Misaligned images 会有两种颜色:一种是洋红色,另一种是黄色。
Misaligned images
洋红色是因为像素没对齐,比如上面的 label,一般情况下因为像素没对齐,需要抗锯齿,图像会出现模糊的现象。
解决办法:在设置 view 的 frame 时,在高分屏避免出现 21.3,6.7这样的小数,尤其是 x,y坐标,用 ceil 或 floor 或 round 取整。每 0.5 个点对应一个 pixel,0.3,0.7这样的就难为 iPhone 了,低分屏不要出现小数。
黄色是因为显示的图片实际大小与显示大小不同,对图片进行了拉伸,测试显示使用 image view 显示实际大小的图也会变黄。
减少洋红色和黄色可以提升滚动的流畅性
手动 Drawing 视图提升流畅性
如果通过上面的方法,滚动速度还不能达到可以容忍的速度,那就只剩下最后一个办法了,手动绘制视图。
手动绘制方法,不是直接子类化 UITableViewCell,然后覆盖 drawRect: 方法,这样你会得到一个大黑块!因为 cell 中不是只有一个 content view。如果不了解 cell 的层次结构,可以用 Reveal 去看下。
绘制 cell 不建议使用 UIView,建议使用 CALayer。 UIView 的绘制是建立在 CoreGraphic 上的,使用的是 CPU。CALayer 使用的是 Core Animation,CPU,GPU 通吃,由系统决定使用哪个。View的绘制使用的是自下向上的一层一层的绘制,然后渲染。Layer处理的是 Texure,利用 GPU 的 Texture Cache 和独立的浮点数计算单元加速 纹理 的处理。
问题已解:在 UIView 的 drawRect 里使用 CG 开头的绘图命令只是触发的伪离屏渲染,绘图还是靠 CPU 同步的在主线程绘制,在 layer 中触发的离屏渲染会触发真正的离屏渲染,在一个独立的进程里绘制。
https://lobste.rs/s/ckm4uw/a_performance-minded_take_on_ios_design/comments/itdkfh
GPU 不喜欢 透明,所以所有的绘图一定要弄成不透明,对于圆角和阴影这些的可以截个伪透明的小图然后绘制上去。在layer的回调里一定也只做绘图,不做计算!

影响 UITableView 滚动的流畅性的原因相关推荐

  1. android八核手机,为什么都八核了手机还是卡?谈智能手机的流畅性

    随着红米Note等手机的热卖,八核手机已经逐渐成普及之势.相比几年前的单核安卓手机,如今的手机性能已经翻了不知道多少倍,可还是有很多用户会产生疑惑:我的手机都八核了,进行某些操作或者使用某些硬件的时候 ...

  2. 定期清理卡巴的report文件夹,否则严重影响系统的流畅性

    定期清理卡巴的report文件夹,否则严重影响系统的流畅性 提醒:请定期清理卡巴的report文件夹,否则严重影响系统的流畅性. 我说这几天打个游戏都觉得有点卡,我还以为是系统垃圾多了就用优化大师卸, ...

  3. win系统流畅度测试软件,视频对比:老电脑装Win7、Win10流畅性测试

    原标题:视频对比:老电脑装Win7.Win10流畅性测试 Windows 10号称比Win7快30%,那么对于旧电脑来说,这一说法还成立吗? 下面网易找来了两台完全相同的三年前售价四千左右的主流电脑, ...

  4. Systrace 流畅性实战 2 :案例分析: MIUI 桌面滑动卡顿分析

    当我们说 流畅度 的时候,我们说的是什么?不同的人对流畅性(卡顿掉帧)有不同的理解,对卡顿阈值也有不同的感知,所以有必要在开始这个系列文章之前,先把涉及到的内容说清楚,防止出现不同的理解,也方便大家带 ...

  5. 一本讲 Android 流畅性的书,应该有什么内容?

    写在前面 最近读了一本新书:<打造流畅的 Android App>,京东链接:https://item.jd.com/10035215362170.html .因为书名所以买了这本书,读完 ...

  6. csgo调哪个会流畅_对于游戏卡顿掉帧说不,三步提高游戏流畅性,让你纵享丝滑画面...

    在我们玩游戏的时候,经常会遇到画面掉帧或者卡顿,严重影响玩家游戏体验,所以小编结合自身经历今天给大家带来如何提高画面帧数以及游戏流畅性的小技巧. 一.什么是FPS数值 要想真正理解FPS,我们必须先科 ...

  7. 一个iOS流畅性优化工具

    ????????关注后回复 "进群" ,拉你进程序员交流群???????? 转自:掘金  BangRaJun https://juejin.cn/post/693472015254 ...

  8. 笔记本卡顿不流畅是什么原因_电脑卡顿不流畅是什么原因

    电脑卡顿不流畅是什么原因 1.连续使用时间过长 电脑长时间运行会导致系统反应速度变慢,应在连续使用几小时后保存数据关机重启一次: 2.系统垃圾过多 系统存在漏洞.电脑中病毒.垃圾文件过多,占据了大量磁 ...

  9. 视频直播技术:最大限度保障流畅性和清晰度

    直播和互动直播在2017年引起了人们的极大关注,应运而生的各种直播类APP多如牛毛.随着互动直播的逐渐兴起,交互成为直播APP的强需求.然而,实际网络中的丢包.延迟.抖动等问题仍然严重影响了直播的效果 ...

最新文章

  1. windows中路径\和 linux中用/
  2. 麦肯锡:物联网九大应用潜力无限 2025年经济价值高达11.1万亿美元
  3. 01-html介绍和head标签
  4. HTML网页制作:[12]使用框架结构之frameset
  5. NB驱动层MQTT发布和订阅数据的代码实现
  6. 【小白学习PyTorch教程】五、在 PyTorch 中使用 Datasets 和 DataLoader 自定义数据
  7. 响应式网页设计代码_消除响应式网站建设设计中的缺陷
  8. 将某个字段改为不重复(unique)
  9. 全国计算机等级考试题库二级C操作题100套(第72套)
  10. jzoj4244-yi【贪心】
  11. android侧边栏点击,侧边菜单栏 android-menudrawer
  12. esp ghost引导_UEFI引导修复教程和工具
  13. 三、Serializer序列化器
  14. 反射中的SetValue和GetValue
  15. 写作技巧~100段作文排比句(61-80段),考试一定用得上,赶紧收藏!
  16. php形状特征提取方法,LowB沙箱-PHP动态特征提取
  17. 浅谈深度学习:基于对LSTM项目`LSTM Neural Network for Time Series Prediction`的理解与回顾
  18. Sobel算子的边缘检测实现
  19. 7.Python条件语句之if语句——从入门到实践
  20. [ARM嵌入式系统开发]第一章之嵌入式系统的软硬件

热门文章

  1. 泰康人寿招聘测评、线上测评题库资料
  2. 程序化交易常用的监管指标
  3. Python调用Tushare获取股市各类数据并导出到Excel
  4. 大作业,但是图片不会传
  5. Mac office ppt无法正常输入文字的问题解决方案
  6. IT经典书籍——Head First系列…
  7. 华为智能眼镜开启智慧畅听新体验:通知自动播报,动动手指就能交互
  8. 笔记本计算机并行口什么开启,如果Acer笔记本电脑在打开时出现黑屏而无法打开计算机,该怎么办...
  9. 用 DirectSound 生成电子鼓!
  10. 2021-11-10 计算圆的周长和面积