TableView的优化

一:什么是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)分段加载数据

 

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

 

转载于:https://www.cnblogs.com/fengmin/p/5497082.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python---静态Web服务器-面向对象开发

1. 以面向对象的方式开发静态Web服务器 实现步骤: 把提供服务的Web服务器抽象成一个类(HTTPWebServer)提供Web服务器的初始化方法,在初始化方法里面创建socket对象提供一个开启Web服务器的方法,让Web服务器处理客户端请求操作。 2. 静态Web服务器-面向…

Androidの网络Http之判断是否连接服务器

1.采用Http方式: public boolean isConnByHttp(){boolean isConn false;URL url;HttpURLConnection conn null;try {url new URL("ttp://wl.daishu001.com/YHDriver.asmx");conn (HttpURLConnection)url.openConnection();conn.setConnectTimeout(100…

linux字符设备驱动之字符之异步通知

在前面的博文中记录的都是应用层主动查询读取驱动按键状态。驱动可不可以在有信号之后,主动上报通知应用层事件呢?当然可以,linux如此博大精深。我们使用异步通信机制,signal的办法实现该功能。 所谓的异步,就是进程可…

【Linux开发】linux设备驱动归纳总结(二):模块的相关基础概念

linux设备驱动归纳总结(二):模块的相关基础概念 系统平台:Ubuntu 10.04 开发平台:S3C2440开发板 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 一。初探linux内核模块 内…

2020-12-24

console.log()&#xff0c;对于一般对于基本类型number、string、boolean、null、undefined 的输出是可信的。但对于Object 等引用类型来说&#xff0c;则就会出现上述异常打印输出。&#xff08;调试复杂数据类型时候通过打断点来看即可&#xff09; 正常预期 <script>…

XAML实例教程系列 - 资源(Resources)

在Windows 8 Metro应用开发中&#xff0c;XAML主要用于应用界面设计&#xff0c;无论是开发人员还是设计人员经常会设计自定义用户界面或者控件行为&#xff0c;其中会涉及到不同方面的代码设计&#xff0c;例如控件模板&#xff0c;控件样式&#xff0c;动画设计等。为了方便设…

LCD显示深究day01 mmap知识补充

<div class"container clearfix"><main><article><h1 class"csdn_top">Linux中的mmap的使用</h1><div class"article_bar clearfix"><div class"artical_tag"><span class"origina…

Python 多线程抓取网页

From: http://www.cnblogs.com/coser/archive/2012/03/16/2402389.html 最近&#xff0c;一直在做网络爬虫相关的东西。 看了一下开源C写的larbin爬虫&#xff0c;仔细阅读了里面的设计思想和一些关键技术的实现。 1、larbin的URL去重用的很高效的bloom filter算法&#xff1…

解决vue的滚动条监听事件无效 解决vue的滚动条scrollTop距离总是为0无效问题

话不多说 直接上代码&#xff08;方法可以直接复制拿去&#xff0c; html部分需要改成你的元素的ref和点击回到顶部的方法名称&#xff09; html <section ref"scrollbox" class"inner-body"><div>这里放了很多内容 出现了滚动条</div&g…

动态规划练习 13

题目&#xff1a;Longest Ordered Subsequence (POJ 2533) 链接&#xff1a;http://acm.pku.edu.cn/JudgeOnline/problem?id2533 #include <iostream> #include <vector> using namespace std; int LIS(const vector<int> &data) { vector<int> n…

奔跑吧Linux内核初识

断更新博客有一段时间了。入职两年了一家创业公司&#xff0c;那是真心的累&#xff0c;当然了获得了技术上很大的提升。搞了两年的vr产品&#xff0c;唯一遗憾的是&#xff0c;平台是ST单片机&#xff0c;远离了系统级别的知识。回看刚出校园时的三年计划&#xff0c;和第一年…

装载问题

1、回溯法 (1)描述:回溯法是一种选优搜索法&#xff0c;按选优条件向前搜索&#xff0c;以达到目标。但当探索到某一步时&#xff0c;发现原先选择并不优或达不到目标&#xff0c;就退回一步重新选择&#xff0c;这种走不通就退回再走的技术为回溯法。 (2)原理: 回溯法在问题的…

android开发(13) 尝试在流布局中移动控件

我们常用的linearlayout,等都属于流布局&#xff0c;在流布局中如何移动控件呢&#xff1f; 我决定做个尝试。虽然可以使用绝对布局&#xff0c;但我不倾向使用这个布局。那么看看我的方式吧。 记得margin这个属性吗&#xff0c;我们就用来它来控制控件的位置&#xff0c;改动它…

阴影 border: 0 0 0 1px #4caaff;

阴影 border: 0 0 0 1px #4caaff;

第一章 处理器体系结构

1.请简述精简指令集RISC和复杂指令集CISC的区别 2.请简述数值 0x123456789 在大小端字节序处理器的存储器中的存储方式 3.请简述在你所熟悉的处理器&#xff08;比如双核Cortex-A9&#xff09;中一条存储读写指令的执行全过程 4.请简述内存屏障&#xff08;memory barrier&am…

Linux双网卡绑定实现

概述&#xff1a;通过网卡绑定&#xff0c;处理网卡单点故障&#xff0c;实验的操作系统是Redhat Linux Enterprise 5.3.绑定的前提条件&#xff1a;芯片组型号相同&#xff0c;而且网卡应该具备自己独立的BIOS芯片。网卡绑定时有四种模式&#xff0c;其中常用的是模式0和模式1…

给element的select添加复选框

需求&#xff1a;要求给select多选的时候&#xff0c;给下拉框前加上复选框样式 element select原样式 需要更改后的样式 html <el-selectv-model"searchObj.knowledgeIds"class"select-box"filterablemultiplecollapse-tagsstyle"margin-left…

TCP选项:TCP_NODELAY和TCP_CORK

From: http://blog.163.com/zhangjie_0303/blog/static/990827062012718316231/ Nagle算法 TCP_NODELAY和TCP_CORK Nagle算法 根据创建者John Nagle命名。该算法用于对缓冲区内的一定数量的消息进行自动连接。该处理过程 (称为Nagling)&#xff0c;通过减少必须发送的封包的…

loop 伪设备 挂在文件系统

dd if/dev/zero of./test.img bs1M count512 losetip /dev/loop1 test.img mkfs.ext3 -L ingben /dev/loop1 dumpe2fs /dev/loop1 tune2fs -l /dev/loo1 mount /dev/loop1 /mnt hexdump -C /dev/loop1 > /dumptext.log1

mysql导入导出数据

用以下命令&#xff0c;导入导出Mysql几百M&#xff0c;几G的数据库都没有问题。注意“--default-character-setutf8”是设置编码的。 1&#xff0c;数据库备份命令&#xff1a; mysqldump -h localhost -u root -p --default-character-setutf8 dbname >backup.sq…