美文网首页
UI视图篇

UI视图篇

作者: again_onceagain | 来源:发表于2020-05-29 17:56 被阅读0次

    UITableView相关

    重用机制

    • 字母索引条

    数据源同步问题

    • 并发访问、数据拷贝

    • 串行访问

    事件传递&视图响应

    UIView和CALayer

    • UIView 为其提供内容,以及负责处理触摸事件,参与响应链

    • CALayer负责显示内容contents

    设计模式:单一职责原则(职责分工)

    事件传递

    
    - (UIView*)hitTest:(CGPoint)pointwithEvent:(UIEvent*)event
    
    - (BOOL)pointInside:(CGPoint)pointwithEvent:(UIEvent*)event
    
    
    image

    点击屏幕 -> UIApplication -> UIWindow -> hitTest:withEvent: -> pointInside:withEvent:

    
        override func touchesBegan(_touches:Set, with event:UIEvent?)
    
        override func touchesMoved(_touches:Set, with event:UIEvent?)
    
        override func touchesCancelled(_touches:Set, with event:UIEvent?)
    
    

    没有处理的事件 就会丢弃,不是引起崩溃 Tip(和方法找不到区分开)

    图像显示原理

    经过CPU、GPU、Frame Buffer(帧缓冲区)、视频控制器、显示器

    CPU: Layout -> Display -> Prepare -> Commit

    - Layout: UI布局和文本计算
    
    - Display:绘制(drawRect:)
    
    - Prepare:图片编解码
    
    - Commit:提交位图
    

    GPU渲染管线

    - 顶点着色
    
    - 图元装配
    
    - 光栅化
    
    - 片段着色
    
    - 片段处理
    

    卡顿&掉帧

    image

    滑动优化方案

    CPU:
    - 对象的创建、调整、销毁
    - 预排版(布局计算、文本计算)
    - 预渲染(文本等异步绘制,图片编解码等)
    GPU:

    • 纹理渲染*(离屏渲染)
    • 视图混合*

    绘制原理&异步绘制

    image

    离屏渲染

    • On-Screen Rendering

    意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行

    • Off-Screen Rendering

    意为离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作

    何时会触发?

    • 圆角(当和maskToBounds一起使用时)

    • 图层蒙版

    • 阴影

    • 光栅化

    为何要避免?

    会增加GPU的工作量,导致CPU+GPU的工作时间大于16.7ms 造成卡顿、掉帧

    相关文章

      网友评论

          本文标题:UI视图篇

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