TableView的优化

摘要:
一:什么是TableView的优化以及为什么要优化1)CPU和GPU:CPU主要从事逻辑计算的一些工作;GPU主要从事图形处理方面的工作。二:UITableView的工作原理1)tablewView代理方法的执行顺序。UITableView返回多少组-----˃每组返回多少行cell---˃计算每个cell的高度----˃指定cell2)cell的复用。三:UITableView的具体优化1)尽量使用cell的复用。3)涉及网络请求加载数据在UITableView滑动结束的时候在进行加载数据(渲染)避免卡顿。

一:什么是TableView的优化以及为什么要优化

1)CPU(中央处理器)和GPU(图形处理器):CPU主要从事逻辑计算的一些工作;GPU主要从事图形处理方面的工作。

2)CPU和GPU的共同点:

都有自己的缓存体系,都有自己的数字和逻辑运算单元,都为了完成计算任务而设计。

3)CPU和GPU的不同点:

CPU的核少但是核内空间非常大,能够处理复杂的逻辑。

GPU核多但是每个核的空间相对较小,故而处理复杂逻辑的空间较少。

针对CPU和GPU的上述不同,面对一个程序系统分配给CPU的往往是较为复杂的逻辑运算,分配给GPU的通常是图片等控件的操作。

4)上述不同而导致的结果:

当程序员为CPU编程时,倾向于用复杂的逻辑结构优化算法来减少计算任务的时间Latency。

为GPU编程->利用其能够处理海量数据的优势,来提高总的数据的吞吐量,来掩盖Latency。

5)为什么优化?

学术上:平衡CPU和GPU在工作上的压力,从而正确的使用CPU和GPU的资源,使他们均匀的负载 这样子使得FPS保持在60帧左右,最终使得用户体验更加美好。

非学术上:掌握UITableView能够给面试加分。

二:UITableView的工作原理

1)tablewView代理方法的执行顺序。

UITableView返回多少组----->每组返回多少行cell--->计算每个cell的高度---->指定cell(cell布局)

2)cell的复用。

原理:当滚动列表时(UITableView)部分cell会移除Window 但是移除的cell并没有被立即释放 而是放到了一个叫做复用池的对象池中,处于待定状态,当有新的cell要出现在Window界面上时,首先会从复用池中寻找是否有相同类型的cell,如果有直接拿过用(最直观的表现是新出现的cell有没有开辟新的内存空间),如果没有,创建一个新的类型的cell,所以UITableView可能拥有多种类型的cell,复用池也可能存储着多种类型的cell,系统通过定义reuseIndentifer作为每个cell的唯一标示符来确定即将出现的cell复用何种类型的cell。

三:UITableView的具体优化

1)尽量使用cell的复用。

使用cell的复用,可以减少内存的开销,没有开辟新的空间,也减少了一些计算量。

2)对于不定高的cell 提前将每个cell的高度存入数组,出现一个cell的时候,直接从数组中拿出确切的高度即可,不用临时计算cell的高度。

图文混排、评论 。

对于固定高的cell和不定高的cell同样适用。

3)涉及网络请求加载数据在UITableView滑动结束的时候在进行加载数据(渲染)避免卡顿。

1、UITableView继承自UIScrollView,继承了后者的方法。

//滑动结束的方法

- (void)scrollViewDidEndDragging:(UIScrollView*)scrollView willDecelerate:(BOOL)decelerate

//减速结束之后的方法

- (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView

2、if(self.tableView.dragging==NO&&self.tableView.decelerating==NO)在tableView必须实现的二个方法中(加载cell的方法中)将数据的渲染写在上述if语句中。

4)对于tableView的自定义控件 尤其是UIImageView,尽量减少使用圆角,阴影等layer属性,尽量减少使用alpha(透明度)来设置透明度,(在项目开发中,让UI设计师设计原图就是带圆角的图) 阴影,圆角这些layer效果都是在GPU中完成的。

1、当多个视图重叠时,GPU会进行合成渲染,而渲染的最慢的操作就是混合,因此当视图结构太过复杂,就会大量消耗GPU的资源,所以当一个空间本身是不透明,注意设定alpha为1,这样可以避免无用的alpha通道合成,降低GPU的负载。

2、对控件设置cornerRadius后对其进行clip或mask操作时 会导致offscreenrendering这个也是在GPU中进行的 如果在滑动时 圆角对象太多 回到GPU的负载大增幅。

这时我们可以设置layer的shouldRasterize属性为YES,可以将负载转移给CPU 更彻底的是直接使用带圆角的原图。

5)尽量使用懒加载

又称为延迟加载 实际上是重写某个对象的getter方法 原理:程序一开始并不对它进行初始化 而是在用到他的时候 才为他开辟内存供它使用。

好处:

1、不必将创建的对象的代码全部写在ViewDidLoad中,代码可读性强。

2、每个控件的getter方法,分别负责各自的实例化处理,代码彼此之间独立性强 松耦合。

6)减少返回给的cell里面的处理逻辑和处理时间。

驴妈妈为例:各个UI控件整合到一起,实际上只有一个控件。

7)设置每个cell的opaque属性 ----面试亮点

opaque意思是不透明的 浑浊的 有YES和NO二个结果

alpha 透明度

如果控件本身不透明,我们设置opaque为YES。

8)分段加载数据

设置分页加载数据,也就是上拉刷新和下拉加载。

免责声明:文章转载自《TableView的优化》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何调整cookie的生命周期webpack4.x最详细入门讲解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

后端服务性能压测实践

转自:https://mp.weixin.qq.com/s/XW9geHZ9odHdI7srDiKBIg 目录 背景 环境检测 压力机及压力工具检测 Linux openfiles limit 设置 排查周边依赖 空接口压测检测 聚合报告中 throughput 计算 压测及性能排查方法 关注各纬度 log Linux 常规命令 性能排查两种方式(...

CoreData使用方法二:NSFetchedResultsController实例操作与解说

        学习了NSFetchedResultsController。才深深的体会到coredata的牛逼之处。原来Apple公司弄个新技术。不是平白无故的去弄,会给代码执行到来非常大的优点。coredata不仅能让我们大大的降低代码量。还最大化的提高执行效率。        就拿NSFetchedResultsController来说吧,他是和...

POI设置边框

在做一个电子表格时,边框的设置有时是必不可少的。这一节就来介绍边框,设置时,可以指定边框的位置,边框的种类,边框的顔色。 首先是边框的位置和种类。对单元格设置边框时,有上下左右位置之分,所以POI也准备了四个不同的方法。 上部的边框: setBorderTop public void setBorderTop(short border) set th...

排查Java高CPU占用原因

近期java应用,CPU使用率一直很高,经常达到100%,通过以下步骤完美解决,分享一下。 方法一: 转载:http://www.linuxhot.com/java-cpu-used-high.html 1.jps 获取Java进程的PID。 2.jstack pid >> java.txt 导出CPU占用高进程的线程栈。 3.top -H...

LTP介绍

1.LTP介绍    LTP--linut test project ,ltp套件是由Linux Test Project所开发的一套系统測试套件。它基于系统资源的利用率统计开发了一个測试的组合,为系统提供足够的压力。    通过压力測试来推断系统的稳定性和可靠性。    压力測试是一种破坏性的測试,即系统在非正常的、超负荷的条件下的执行情况 。用来评...

解读eXtremeComponents代码结构--转载

原文地址:http://blog.csdn.net/lark3/article/details/1937466 大致整理了去年写的东西,罗列如下: ec是一系列提供高级显示的开源JSP定制标签,当前的包含的组件为eXtremeTable,用于以表形式显示数据。ec现在的版本是1.0.1,由Jeff Johnston开发的,网址:http://www.ex...