UI相关

作者: cheng1314 | 来源:发表于2023-12-14 15:24 被阅读0次

Tableview很多数据,如何优化cell加载

事件传递和响应过程

UIView和CALayer的关系?

UIView 继承 UIResponder,是专门负责事件传递和视图响应的,而CALayer负责视图的显示,这里用到了六大设计原则中的单一职责原则。

UI创建到渲染到屏幕上整体的流程机制?

RunLoop是一个60fps的回调,也就是说每16.7ms绘制一次屏幕,也就是我们需要在这个时间内完成view的缓冲区创建,view内容的绘制这些是CPU的工作;然后把缓冲区交给GPU渲染,这里包括了多个View的拼接(Compositing),纹理的渲染(Texture)等等,最后Display到屏幕上。

事件传递及视图响应过程是怎样的?

事件传递:
我们点击屏幕产生触摸事件,系统将这个事件加入到一个由UIApplication管理的事件队列中,UIApplication会从消息队列里取事件分发下去,首先传给UIWindow
在UIWindow中就会调用hitTest:withEvent:方法去返回一个最终响应的视图
在hitTest:withEvent:方法中就会去调用pointInside: withEvent:去判断当前点击的point是否在UIWindow范围内,如果是的话,就会去遍历它的子视图来查找最终响应的子视图
遍历的方式是使用倒序的方式来遍历子视图,也就是说最后添加的子视图会最先遍历,在每一个视图中都回去调用它的hitTest:withEvent:方法,可以理解为是一个递归调用
最终会返回一个响应视图,如果返回视图有值,那么这个视图就作为最终响应视图,结束整个事件传递;如果没有值,那
么就会将UIWindow作为响应者
视图响应:
如果view的控制器存在,就传递给控制器处理;如果控制器不存在,则传递给它的父视图
在视图层次结构的最顶层,如果也不能处理收到的事件,则将事件传递给UIWindow对象进行处理
如果UIWindow对象也不处理,则将事件传递给UIApplication对象
如果UIApplication也不能处理该事件,则将该事件丢弃

UITableView优化方案?

本质上是降低 CPU、GPU 的工作,从这两个大的方面去提升性能。
CPU:对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制
GPU:纹理的渲染

  • 卡顿优化在 CPU 层面
    尽量用轻量级的对象,比如用不到事件处理的地方,可以考虑使用 CALayer 取代 UIView
    不要频繁地调用 UIView 的相关属性,比如 frame、bounds、transform 等属性,尽量减少不必要的修改
    尽量提前计算好布局,在有需要时一次性调整对应的属性,不要多次修改属性
    Autolayout 会比直接设置 frame 消耗更多的 CPU 资源
    控制一下线程的最大并发数量
    尽量把耗时的操作放到子线程
    文本处理(尺寸计算、绘制)
    图片处理(解码、绘制)
  • 卡顿优化在 GPU层面
    尽量避免短时间内大量图片的显示,尽可能将多张图片合成一张进行显示
    GPU能处理的最大纹理尺寸是 4096x4096,一旦超过这个尺寸,就会占用 CPU 资源进行处理,所以纹理尽量不要超过这个尺寸
    尽量减少视图数量和层次
    减少透明的视图(alpha<1)
    尽量避免出现离屏渲染
  • iOS 保持界面流畅的技巧
    1.预排版,提前计算
    在接收到服务端返回的数据后,尽量将 CoreText 排版的结果、单个控件的高度、cell 整体的高度提前计算好,将其存储在模型的属性中。需要使用时,直接从模型中往外取,避免了计算的过程。
    2.预渲染,提前绘制
    例如圆形的图标可以提前在,在接收到网络返回数据时,在后台线程进行处理,直接存储在模型数据里,回到主线程后直接调用就可以了
    避免使用 CALayer 的 Border、corner、shadow、mask 等技术,这些都会触发离屏渲染。
    3.异步绘制
    4.全局并发线程
    5.高清的图片异步加载

ViewController的生命周期?

当一个视图控制器被创建,并在屏幕上显示的时候。 代码的执行顺序
1、 alloc 创建对象,分配空间
2、init (initWithNibName) 初始化对象,初始化数据
3、loadView 载入视图
4、viewDidLoad 载入完成,可以进行自定义数据以及动态创建其他控件
5、viewWillAppear 视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
6、viewDidAppear 视图已在屏幕上渲染完成

当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反
1、viewWillDisappear 视图将被从屏幕上移除之前执行
2、viewDidDisappear 视图已经被从屏幕上移除,用户看不到这个视图了
3、dealloc 视图被销毁,将创建的对象进行释放

什么是离屏渲染,如何避免离屏渲染?

GPU渲染机制:
CPU 计算好显示内容提交到 GPU,GPU 渲染完成后将渲染结果放入帧缓冲区,随后视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据,经过数模转换传递给显示器显示。

GPU屏幕渲染有以下两种方式:

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

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

离屏渲染的触发方式
圆角、遮罩、阴影、光栅化等会触发离屏渲染,模拟器Color OffScreen Render进行检查。

相关文章

  • UI相关

    1.NAV和ToolBar && Tabbar icon尺寸

  • UI相关

    ScrollView内容位置向下偏移或不存在 原因分析: NavigationController导致scroll...

  • UI相关

    1. button 图标和文字位置设置 //图标[button setImage:[UIImage imageNa...

  • UI相关

    1.$\color{red}{UIView和CAlayer的区别?}$ 每个UIView内部都有一个CALayer...

  • UI相关

    重用机制、数据源同步、图像显示、UI掉帧卡顿、UIView的异步绘制、离屏渲染 1.重用机制 cell = [ta...

  • 网易UI微专业课笔记——UI零基础预习课程

    一、UI设计概述 UI相关术语解释 UI(User Interface)用户界面 GUI(Graphical Us...

  • 多线程相关

    引文: 多线程相关 OC 语言相关 内存管理相关 UI视图相关 RunLoop相关 GCD NSOperation...

  • iOS 常用第三方库统计

    Demo集合 动画相关 UI相关 图片相关 数据库相关 播放器相关 工具类 Helper

  • # UI视图相关

    UI视图相关 UITableView 事件传递&视图响应 图像显示原理 卡顿&掉帧 绘制原理&异步绘制 离屏渲染 ...

  • UI视图相关

    1.事件传递及相应 (1)UIView及CALayer UIView为其提供内容,以及负责触摸等事件,参与视图事件...

网友评论

      本文标题:UI相关

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