以前问到如何优化复杂
UITableViewCell
卡顿的问题, 有位大佬发了下面的一段文字, 在此记录一下web
1.cell
的行高不是固定值,须要计算,则要尽量缓存行高值,避免重复计算行高。由于 heightForRowAtIndexPath:
是调用最频繁的方法。缓存
2.滑动时按需加载,这个在大量图片展现,网络加载的时候很管用!(SDWebImage
已经实现异 步加载,配合这条性能杠杠的)。网络
3.正确使用 reuseIdentifier
来重用 Cells
异步
4.尽可能少用或不用透明图层性能
5.若是 Cell
内现实的内容来自 web
,使用异步加载,缓存请求结果优化
6.减小 subviews
的数量线程
7.在 heightForRowAtIndexPath:
中尽可能不使用 cellForRowAtIndexPath:
,若是你须要用到它, 只用一次而后缓存结果code
8.全部的子视图都预先建立,若是不须要显示能够设置 hidden
,尽可能少动态给 Cell
添加 View
生命周期
9.颜色不要使用 alph
图片
10.栅格化
11.cell
的 subViews
的各级 opaque
值要设成 YES,尽可能不要包含透明的子 View
opaque
用于辅助绘图系统,表示 UIView
是否透明。在不透明的状况下,渲染视图时须要快速 地渲染,以提高性能。渲染最慢的操做之一是混合(blending
)。提高性能的方法是减小混合操 做的次数,其实就是 GPU
的不合理使用,这是硬件来完成的(混合操做由 GPU
来执行,由于这 个硬件就是用来作混合操做的,固然不仅是混合)。 优化混合操做的关键点是在平衡 CPU
和 GPU
的负载。还有就是 cell
的 layer
的 shouldRasterize
要设成 YES
。
12.cell
异步加载图片以及缓存
13.异步绘制
(1)在绘制字符串时,尽量使用 drawAtPoint: withFont:
,而不要使用更复杂的 drawAtPoint:(CGPoint)point forWidth:(CGFloat)width withFont:(UIFont *)font lineBreakMode:(UILineBreakMode)lineBreakMode
; 若是要绘制过长的字符串,建议本身先截 断,而后使用 drawAtPoint: withFont:
方法绘制。
(2)在绘制图片时,尽可能使用 drawAtPoint
,而不要使用 drawInRect
。drawInRect
若是在绘 制过程当中对图片进行放缩,会特别消耗 CPU
。
(3)其实,最快的绘制就是你不要作任何绘制。有时经过 UIGraphicsBeginImageContextWithOptions()
或者 CGBitmapContextCeate()
建立位图会显 得更有意义,从位图上面抓取图像,并设置为 CALayer
的内容。 若是你必须实现 -drawRect:
,而且你必须绘制大量的东西,这将占用时间。
(4)若是绘制 cell
过程当中,须要下载 cell
中的图片,建议在绘制 cell
一段时间后再开启图 片下载任务。譬如先画一个默认图片,而后在 0.5S 后开始下载本 cell
的图片。
(5)即便下载 cell
图片是在子线程中进行,在绘制 cell
过程当中,也不能开启过多的子线程。 最好只有一个下载图片的子线程在活动。不然也会影响 UITableViewCell
的绘制,于是影响了 UITableViewCell
的滑动速度。(建议结合使用 NSOpeartion
和 NSOperationQueue
来下载图片, 若是想尽量找的下载图片,能够把[self.queuesetMaxConcurrentOperationCount:4];
)
(6)最好本身写一个 cache
,用来缓存 UITableView
中的 UITableViewCell
,这样在整个 UITableView
的生命周期里,一个 cell
只需绘制一次,而且若是发生内存不足,也能够有效的 释放掉缓存的 cell
。
14.不要将 tableview
的背景颜色设置成一个图片。这回严重影响 UITableView
的滑动速度。在 限时免费搜索里,我曾经翻过一个错误:self.tableView_.backgroundColor = [UIColorcolorWithPatternImage:[UIImageimageNamed:@"background.png"]];
经过这种方式 设置 UITableView
的背景颜色会严重影响 UTIableView 的滑动流畅性。修改为 self.tableView_.backgroundColor = [UIColor clearColor];
以后,fps
从 43
上升到 60
左右。 滑动比较流畅。