美文网首页
UITableview的优化

UITableview的优化

作者: 丨十三叔丨 | 来源:发表于2019-05-05 17:45 被阅读0次

    优化方法:(缓存高度,异步绘制,减少层级,hide,避免离屏渲染)

    缓存高度

    提前计算好cell的高度和布局

    异步绘制

    在Cell上添加系统控件的时候,实质上系统都需要调用底层的接口进行绘制,当我们大量添加控件时,对资源的开销也会很大,所以我们可以索性直接绘制,提高效率。

    //异步绘制
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        CGRect rect = CGRectMake(0, 0, 100, 100);
        UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0);
        CGContextRef context = UIGraphicsGetCurrentContext();
        [[UIColor lightGrayColor] set];
        CGContextFillRect(context, rect);
    
        //将绘制的内容以图片的形式返回,并调主线程显示
        UIImage *temp = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        // 回到主线程
        dispatch_async(dispatch_get_main_queue(), ^{
            //code
        });
    });
    
    减少层级

    减少SubViews的数量, 在滑动的列表上,多层次的view会导致帧数的下降。
    例如: 绘制 cell 不建议使用 UIView,建议使用 CALayer。
    从形式来说:UIView 的绘制是建立在 CoreGraphic 上的,使用的是 CPU。CALayer 使用的是 Core Animation,CPU,GPU 通吃,由系统决定使用哪个。View的绘制使用的是自下向上的一层一层的绘制,然后渲染。Layer处理的是 Texure,利用 GPU 的 Texture Cache 和独立的浮点数计算单元加速 纹理 的处理。
    从事件的响应来说:UIView是 CALayer 的代理,layer本身并不能响应事件,因为layer是直接继承自NSObject,不具备处理事件的能力。而 UIView 是继承了UIResponder 的,这也是事件转发的角度上说明,view要比单纯的layer复杂的多。多层次的view再加上各种手势的处理势必导致帧数的下降。

    hide

    尽量少用addView给Cell动态添加View,可以初始化时就添加,然后通过hide来控制是否显示

    避免离屏渲染

    为了保证TableView的流畅,当快速滑动的时候,cell必须被快速的渲染出来。所以cell渲染的速度必须快。如何提高cell的渲染速度呢?

    当有图像时,预渲染图像,在bitmap context先将其画一遍,导出成UIImage对象,然后再绘制到屏幕,这会大大提高渲染速度。具体内容可以自行查找“利用预渲染加速显示iOS图像”相关资料。
    渲染最好时的操作之一就是混合(blending)了,所以我们不要使用透明背景,将cell的opaque值设为Yes,背景色不要使用clearColor,尽量不要使用阴影渐变等
    由于混合操作是使用GPU来执行,我们可以用CPU来渲染,这样混合操作就不再执行。可以在UIView的drawRect方法中自定义绘制。

    当然除了这些, 还有其他的优化方法:

    正确地使用UITableViewCell的重用机制
    避免阻塞主线程
    按需加载
    尽可能重用开销比较大的对象
    尽量减少计算的复杂度

    相关文章

      网友评论

          本文标题:UITableview的优化

          本文链接:https://www.haomeiwen.com/subject/lxwhoqtx.html