如何优化tableView

以前问到如何优化复杂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.cellsubViews 的各级 opaque 值要设成 YES,尽可能不要包含透明的子 View opaque 用于辅助绘图系统,表示 UIView 是否透明。在不透明的状况下,渲染视图时须要快速 地渲染,以提􏰀高性能。渲染最慢的操做之一是混合(blending)。提􏰀高性能的方法是减小混合操 做的次数,其实就是 GPU 的不合理使用,这是硬件来完成的(混合操做由 GPU 来执行,由于这 个硬件就是用来作混合操做的,固然不仅是混合)。 优化混合操做的关键点是在平衡 CPUGPU 的负载。还有就是 celllayershouldRasterize 要设成 YES

  • 12.cell 异步加载图片以及缓存

  • 13.异步绘制

    • (1)在绘制字符串时,尽量使用 drawAtPoint: withFont:,而不要使用更复杂的 drawAtPoint:(CGPoint)point forWidth:(CGFloat)width withFont:(UIFont *)font lineBreakMode:(UILineBreakMode)lineBreakMode; 若是要绘制过长的字符串,建议本身先截 断,而后使用 drawAtPoint: withFont:方法绘制。

    • (2)在绘制图片时,尽可能使用 drawAtPoint,而不要使用 drawInRectdrawInRect 若是在绘 制过程当中对图片进行放缩,会特别消耗 CPU

    • (3)其实,最快的绘制就是你不要作任何绘制。有时经过 UIGraphicsBeginImageContextWithOptions() 或者 CGBitmapContextCeate() 建立位图会显 得更有意义,从位图上面抓取图像,并设置为 CALayer 的内容。 若是你必须实现 -drawRect:,而且你必须绘制大量的东西,这将占用时间。

    • (4)若是绘制 cell 过程当中,须要下载 cell 中的图片,建议在绘制 cell 一段时间后再开启图 片下载任务。譬如先画一个默认图片,而后在 0.5S 后开始下载本 cell 的图片。

    • (5)即便下载 cell 图片是在子线程中进行,在绘制 cell 过程当中,也不能开启过多的子线程。 最好只有一个下载图片的子线程在活动。不然也会影响 UITableViewCell 的绘制,于是影响了 UITableViewCell 的滑动速度。(建议结合使用 NSOpeartionNSOperationQueue 来下载图片, 若是想尽量找的下载图片,能够把[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];以后,fps43 上升到 60 左右。 滑动比较流畅。

相关文章
相关标签/搜索