博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 离屏渲染
阅读量:5992 次
发布时间:2019-06-20

本文共 975 字,大约阅读时间需要 3 分钟。

1.什么是离屏渲染

在使用圆角、阴影和遮罩等视图功能的时候,图层属性的混合体被指定为在未预合成之前不能直接在屏幕中绘制,所有就需要在屏幕外的上下文中渲染,即离屏渲染。

2.UIView和CALayer的关系

UIView继承UIResponder,可以处理系统传递过来的事件,每个UIView内部都有一个CALayer提供内容的绘制和显示

CALayer继承NSObject类,负责UIView提供内容的contents。CALayer有三个视图元素:背景色,内容,边框。其中内容的本质就是一个CGImage

3.界面渲染过程

Runloop有一个60fps的回调,即每16.7ms绘制一次屏幕,所以view的绘制必须在这个时间内完成,view内容的绘制是cpu的工作,然后把绘制的内容交给GPU渲染,包括多个view的拼接,纹理的渲染等,最后显示在屏幕上,但是,如果无法在16.7ms内容完成绘制,就会出现丢帧的问题,一般情况下,如果帧率保证在30fps以上,界面卡顿效果不明显。

渲染过程如下:

UIView的layer层有一个content,指向一块缓存

UIView绘制时会调用drawRect方法,通过context将内容写入缓存

在缓存写完后,通过renderserver交给GPU去渲染,将缓存中的bitmap数据显示在屏幕上

4.离屏渲染卡顿的原因:

离屏渲染之所以会特别消耗性能,是因为要创建一个屏幕外的缓存区,然后从当前屏幕缓存区切换到屏幕外的缓存区,然后再完成渲染。其中切换缓存区和切换上下文最消耗性能,而绘制不是性能消耗的主要原因。设置以下属性,就会触发离屏绘制:

光栅化/遮罩/阴影/抗锯齿/不透明/圆角/渐变

5.屏幕渲染类型:

CPU计算好显示内容提交到GPU,GPU渲染完成后将渲染结果放到帧缓存区,随后视频控制器会按照VSync信号逐行读取帧缓存区的数据。

当前屏幕渲染:GPU渲染操作就是在当前用于显示的屏幕缓冲区中

离屏渲染:GPU在当前屏幕缓冲区以外开辟一个新的缓冲区进行渲染操作

CPU的离屏渲染:重写drawrect方法,并且使用任何CoreGraphics的技术进行了绘制操作,就设计到了cpu渲染。

转载于:https://juejin.im/post/5cbb23436fb9a0686c019a6f

你可能感兴趣的文章
Jquery filter()方法简介
查看>>
SVN常见问题及解决方式(一)
查看>>
算法-search
查看>>
线程间通信推荐用队列
查看>>
个人项目实验报告——记事本
查看>>
初识django框架
查看>>
vue02
查看>>
topcoder srm 709 div1
查看>>
topcoder srm 685 div1
查看>>
flash Timer类使用
查看>>
博客目录
查看>>
SAP自带的创建报表工具
查看>>
无向图的 DFS 和 BFS实现 (以邻接表存储的图)
查看>>
Sharepoint2010 如何 对搜索结果做自定义标签
查看>>
iOS 判断NSString是否包含某个字符串
查看>>
iOS extern 和 #define 使用
查看>>
该对象尚未初始化。请确保在所有其他初始化代码后面的应用程序启动代码中调用 HttpConfiguration.EnsureInitialized()。...
查看>>
ios上表单默认样式
查看>>
ARC下需要注意的内存问题
查看>>
使用xcode workspace 多个project协同工作
查看>>