【iOS高级资深工程师面试篇】①、2022年,金九银十我为你准备了《iOS高级资深工程师面试知识总结》 UI部分3/3 -UIView绘制原理-离屏渲染

一、UIView绘制原理

❓面试考点: 往往出现高级、资深工程师的考点之中 请你说说UIView绘制的原理
1. UIView绘制原理的流程图
Created with Raphaël 2.3.0 [UIView setNeedsDisplay] [CALayer setNeedsDisplay] [CALayer display] layer.delegate respoendTo@selector(displayLayer:) 异步绘制入口 结束 系统绘制流程 yes no
  1. 当我们调用UIView的 setNeedsDisplay方法时候。
    系统会立即调用 [view.layer setNeedsDisplay]方法。相当于在layer上面打上了一个脏标记。
    然后再RunLoop即将结束的时候。才会调用[CALayer display]方法
    然后才进入我们视图真正绘制工作流程当中。
  2. 所以我们可以回答说,为什么UIView的调用 setNeedsDisplay方法并没有立刻发生对应视图的绘制工作。
    实际上是。当RunLoop将要结束的时候。才会开始进入视图绘制流程当中。
  3. CALayer的delegate是否会响应displayLayer。如果不响应 就进入 系统绘制流程
    如果CALayer的delegate 响应了 displayLayer方法的时候。 就会进入异步绘制入口
2. UIView系统绘制原理
YES
NO
CALayer creates backing store CGContextRef
layer has delegate?
layer.delegate drawLayer:inConext
UIView drawRect:
CALayer uploads backing store to GPU
CAlayer darwInContext:
结束

对于系统内部绘制流程

  1. 内部会创建一个 CALayer creates backing store(CGContextRef)
    我们可以理解为CGContextRef,CGContextRef方法当中可以通过上下文获取取出栈顶的context,拿到的就是当前控件的上下文或者是backing store
  2. 然后layer会进行判断。它是否有代理
    如果没有就会调用 [CALayer drawInContext]
    如果就会调用 [layer.delegate drawLayer:inContext:]
  3. 然后做当前视图的绘制工作 - 发生在系统内部绘制当中的
  4. 然后再合适的时机给予我们的一个回调方法[UIView drawRect:]
  5. drawRect默认实现 其实就是什么都不做的
    系统给我们开drawRect的铐子。其实就是允许我们在系统绘制的基础之上。做一些其他的绘制工作。
    不管哪两个分支。最终都是由CALayer的backing store 上传到 GPU
    最终就结束系统默认的流程
3. 异步绘制
❓面试考点: 是否知道异步绘制、怎么进行异步绘制

在这里插入图片描述

待完成

二、离屏渲染

待完成

猜你喜欢

转载自blog.csdn.net/qq_42816425/article/details/127156319