图像显示原理
image.png1.CPU:输出位图
2.GPU :图层渲染,纹理合成
3.把结果放到帧缓冲区(frame buffer)中
4.再由视频控制器根据vsync信号在指定时间之前去提取帧缓冲区的屏幕显示内容
5.显示到屏幕上
CPU工作
1.Layout: UI布局,文本计算
2.Display: 绘制
3.Prepare: 图片解码
4.Commit:提交位图
GPU渲染管线(OpenGL)
顶点着色,图元装配,光栅化,片段着色,片段处理
〜
UI卡顿掉帧原因
一般来说,页面滑动流畅是60fps,也就是1s有60帧更新,即每隔16.7ms就要产生一帧画面,而如果CPU和GPU加起来的处理时间超过了16.7ms,就会造成掉帧甚至卡顿。
〜
滑动优化方案
CPU:把以下操作放在子线程中
1.对象创建、调整、销毁
2.预排版(布局计算、文本计算、缓存高度等等)
3.预渲染(文本等异步绘制,图片解码,图像绘制等)
GPU:
纹理渲染,视图混合,图形生成
一般遇到性能问题时,考虑以下问题:
是否受到CPU或者GPU的限制?
是否有不必要的CPU渲染?
是否有太多的离屏渲染操作?
是否有太多的图层混合操作?
是否有奇怪的图片格式或者尺寸?
是否涉及到昂贵的view或者效果?
view的层次结构是否合理?
〜
离屏渲染
一般情况下,都是在当前显示屏幕缓冲区中进行的,但是当有圆角等特殊情况时,此时在屏幕缓冲区中无法进行渲染,需要生成一个新的缓冲区中进行渲染,然后绘制到屏幕缓冲区,这个过程需要进行上下文切换,会消耗很多资源。而且这个过程每一帧都会进行。
会触发离屏渲染的操作:
shouldRasterize(光栅化)
masks(遮罩)
shadows(阴影)
edge antialiasing(抗锯齿)
group opacity(不透明)
圆角(当和maskToBounds一起使用时)
渐变
Text(UILabel, CATextLayer, Core Text, etc)...
参考:iOS-离屏渲染详解
参考:iOS-图像显示优化
网友评论