1.数据源同步方案?
并发访问,深拷贝,记录操作(耗内存,记录操作);串行访问,排版和操作全部在一个子线程串行队列操作(任务多,会延时)
2.UIView和CALayer的关系?
的UIView只负责处理触摸等事件,参与响应链; CALayer的负责显示内容的内容
uiview包含一个calayer和一个bgcolor(bgcolor对层同名属性方法的包装)
显示部分是图层的内容(后备存储实际位图类型的位图)
3.事件传递?
- (uiview *)hittest哪个视图响应事件 - (bool)pointinside判断点击位置是否在视图范围内
流程:点击屏幕--uiapplication - 一个UIWindow - 则hitTest - pointinside
判断:隐藏的userinteractionenabled alpha> 0.01
4.图像显示原理
cpu(位图)--- gpu(位图图层渲染纹理合成) - 放到帧缓冲区(帧缓冲区)---视频控制器(根据vsync信号在指定时间前提取对应帧缓冲区中的屏幕显示内容)---显示器
CPU工作:layout(UI布局文本计算)显示(绘制drawrect)prepare(图片编解码)commit(提交位图)
GPU渲染管线:顶点着色图元装备光栅化片段着色片段处理
5.优化方案
CPU(减轻压力和时长)
对象创建,调整,销毁(放到子线程)预排版(布局计算文本计算提前计算放到子线程)预渲染(文本等异步绘制,图片编解码)
GPU
纹理渲染(避免离屏渲染)视图混合(少点视图层级)
6.UIView的绘制原理
系统绘制流程:
异步绘制:
【layer.delegate displaylayer:]代理负责生成对应的位图;设置该位图作为layey.contents属性的值
7.离屏渲染屏幕渲染屏幕上的屏幕渲染
GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行操作,某些属性在未预合成之前,不能用于屏幕直接显示,触发离屏渲染
场景:圆角(当和和masktobounds一起使用时),图层蒙版,阴影,光栅化。
当前屏幕渲染,说的是gpu的渲染操作是在当前用于显示的屏幕缓冲区中进行
为何要避免:会增加GPU的工作量,导致CPU和GPU的工作量超出16.7毫秒,会导致用户界面卡顿掉帧