UI视图面试小结

2019-03-24  本文已影响0人  TAsama
  1. UITableView重用机制,重点“重用池”
  2. UITableView的数据源异步操作,可以使用队列方式,如下图:


    UITabeleView的异步处理数据源操作
  3. UIView和CALayer的关系

这种方式符合设计模式中的单一职能原则

  1. 事件传递
    在事件传递中核心关键点就是会调用到:
- (UIView *)hitTest:(CGPoint)point with Event:(UIEvent *)event;
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

这两个方法,第一个方法用于找出事件的响应者,第二个方法用于确定事件触发的位置。
通过这两个方法来做事件的传递和响应过程,如下图:


事件传递

hittest方法内部会进行一个递归调用,对响应者的所有subviews调用hittest,如下图:


hitTest的系统实现
  1. 图像显示原理


    图像显示原理

    可以看到,CPU处理了UI布局,绘制,以及图片编解码等预处理工作,最后将bitmap位图提交给GPU进行屏幕渲染。

  2. UI卡顿、掉帧的原因
    屏幕的刷新频率是60帧,即每16.7ms就会进行一次屏幕刷新,如果此时系统中绘制渲染工作还没有完成,则会将显示拖延到下一个刷新点,这样就会造成掉帧,如下图中的这种情况:


    UI卡顿、掉帧的原因
  3. 优化方案

UIView的绘制原理


UIView的绘制原理

CALayer会在当前loop结束前调用自身的display方法进行绘制,下图是系统调用CALayer的display方法绘制的流程:


CALayer的系统绘制流程
UIView的drawRect方法是一个空方法,他给调用者提供了一个在系统绘制的基础上二次操作的空间。
bitmap作为layer的contents属性的值,在被赋值后提交给GPU进行渲染。

我们可以在displayLayer方法中进行异步绘制。


异步绘制
  1. 离屏渲染

何时会触发?

由于离屏渲染要创建新的渲染缓冲区,同时还要进行上下文的切换,这会增加GPU的处理时间,可能会造成掉帧

上一篇 下一篇

猜你喜欢

热点阅读