3.Cell自己本身内部的调整
首先呢,大家都会用最基本的复用把...
[tableView dequeueReusableCellWithIdentifier:@"reuseID" forIndexPath:indexPath];
很久之前的写法是判断有没有Cell,如果有的话就根据可重用ID去缓存池中去取,否则就自己alloc/init...
现在一般都是提前注册好Cell....
[tableView registerClass:[XXTableViewCell class] forCellReuseIdentifier:@"reuseID"];
[tableView registerNib:[UINib nibWithNibName:@"yourNibName" bundle:nil] forCellReuseIdentifier:@"reuseID"];
其实吧,Cell内部的子控件越少越好,层次越少越好,但是我们一般都不会去优化这一项,因为产品的需求就是那样,你总不能跑去跟产品说,哎呀,我们的Cell可能会有一点点卡,那个...单元格就别那么花哨了?....
显然那是不可以的嘛...所以我们还是自己敲代码的时候注意一点吧,尽量减少一下subviews的数量...
既然上面那点无法去优化呢,那么咱们还是看看Cell里面其他的地方怎么优化吧...
首先呢,Cell里面显示的内容要提前准备好,数据呢,要提前算好,然后去直接显示;视图呢要提前加载好所有的控件,然后根据你的需要去显示还是隐藏,千万不要再表格滚动的时候再动态的去创建,移除控件....
之前我们公司有一个萌萌哒小弟弟,在画表格的时候那个思路真的是别具一格,TableView不是能够复用嘛,为了不出复用的bug,所以他在滚动的时候先移除所有的UIImageView,然后再滚动的时候手动创建UIImageView.....
只能说年轻人,想法不错.....
一般我们遇到这种情况,首先要考虑先把所有的都依次创建好,然后根据需要去隐藏显示啊,再滚动的时候疯狂创建和移除是非常消耗性能的...
另外,之前第1点也说过,在Cell内部的子控件不要使用alpha,如果非要那种炫酷的模糊效果的话,那么还是麻烦一下美工小姐姐把,或者用Sketch自己搞,或者开上下文自己画,总之方法多多,但是千万别简单的设置一个alpha....
因为alpha会造成混合图层(Blended Layers),滑动的时候也会影响性能....
4.Cell的栅格化处理
首先我们先科普一个小姿势....
Xcode有这么一个小工具,在Development Tools有这么一个叫做Instruments的工具,里面有个叫做Core Animation的东西,是专门检测帧率的
注意呀!亲爱的小伙伴们,一定要用真机啊,不能用模拟器呀<真机和模拟器的架构是完全不一样的>....
用的时候记得改成降序,然后就能看到手机的刷新帧率了....
众所周知,手机如果想看到完美的屏幕,手机都是要从上到下从左到右一个一个点绘制出来的,而要想产生动画的效果呢,屏幕就要一直去刷新;我们手机会在一秒的时间内重新绘制60次,所以看起来很连贯,因为根据我们的视觉帧率惯性,只要超过24帧就可以感觉到比较流畅的动画了....
不懂?举个栗子🌰...很久之前摄像机拍电脑屏幕是不是感觉会花屏?是因为摄像机拍摄频率是24帧,而屏幕刷新是60帧,所以就花屏了....
而手机程序呢,如果有比较好的显示效果,最好把帧率维持在55以上,大家可以去看一下大厂的app,滚动的时候基本维持在58以上,真的是灰常腻害的....
继续举个栗子🌰,什么时候帧率达不到很高的帧率的呢,就是我们的模型数据在显示之前会做大量的计算,会导致下一次/下下次屏幕刷新之前模型还木有计算完,没计算完..没计算完啊啊啊啊啊啊啊!!!!!
大家想一下,是不是这一帧(下一帧)就跳过去了呢....额...这就是跳帧....这种卡顿,在tableView上面体现的非常明显,用户体验灰常不好!!!!!!!!!
所以,为了用户的体验,最低最低,帧率也要在50+以上才可以
所以的所以,如果要提高表格性能,最终要的就是要减少-----计算量!!!!!!
从而保证每一帧都能够完成计算!!!!!!!
从而达到流畅的效果.....
模拟器还有一个功能叫做离屏渲染,有细心的小伙伴们可以把这个选项勾上..看看你的视图是不是没有变黄了呢.....
如果没黄呢.可以看看我下面的那一句小代码....<要是黄就算了>...哈哈哈哈哈
那么我们就说栅格化吧,大家想一下,我们在滚动的过程中是否要和Cell里面的内容进行交互呢?不用吧....我们是否需要看到Cell里面的动态效果呢(比如有张gif)?不用吧.....
所以呢,我们可以将Cell中的内容生成一张独立的图像,在屏幕滚动的时候只显示这张图像
cell.layer.shouldRasterize = YES;
其实讲了这么多,栅格化就这么一句代码....
其他注意的地方就是,栅格化的时候一定要指定一下屏幕的分辨率否则会默认使用 *1 来生成图像...
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
大家再看一下离屏渲染,是不是全都黄了呢,这就是在栅格化的时候单元格变成了一张张图片,然后就黄了....
然后大家在看一下混合图层,在滚动的时候,红红的表格会透露着绿绿的单元格,这也是因为滚动的时候栅格化了一张张图片....
另外,在图层上有一个异步绘制,苹果官方貌似也没怎么介绍过这个,就那么一句话(如果cell比较复杂可以使用,但是平时不建议使用)
cell.layer.drawsAsynchronously = YES;
但是我感觉,用Core Animation跑的时候,帧率的刷新帧率会提高一点吧...
额,就这样~