1. 界面卡顿的原因。主要从两个角度考虑,cpu限制—》对象的创建,释放,属性调整,CALayer的属性调整的时候是会创建隐士动画,是比较损耗性能的;视图和文本的布局计算,AutoLayout的布局计算都是在主线程上的,所以占用CPU时间也很多;文本渲染如UILable和UITextView都是在主线程渲染的;图片的解码,通常UIImage只有在交给GPU之前的一瞬间,CPU才会对其解码。GPU限制—》视图的混合,比如一个界面十几层的视图叠加到一起,GPU不得不计算每个像素点要显示的像素;离屏渲染如视图的Mask,圆角,阴影。半透明,GPU不得不进行数学计算,如果是不透明的,cpu只需取上层的就可以了;浮点数像素
2. 界面显示的原理:iOS设备通常是60fps(每秒60帧),也就是说两帧相隔的时间是1/60秒。大概16.7ms。为了显示一帧,需要如下工作:*CPU计算好各个视图的位置,大小,对图片进行解码等,绘制成纹理交给GPU, *GPU对收到的纹理进行混合,顶点变换,渲染到帧缓冲区,每16.7ms,一个时钟信号到达,帧缓冲区取出一帧,显示到屏幕。也就是说,CPU或者GPU被大量占用的时候,都有可能在16.7ms中没法办法完成一帧的绘制,导致信号到来的时候,取得还是上一帧的内容,也就都有可能导致界面卡顿。
3. 离屏渲染:在iOS中,渲染通常分为CPU和GPU渲染两种,而GPU渲染又分为在GPU缓冲区和非GPU缓冲区两种。*CPU渲染(软件渲染),CPU绘制成bitmap,交给GPU。 *GPU渲染(硬件渲染)—》GPU缓冲区渲染和非GPU缓冲区渲染(额外开辟缓冲区)。通常CPU渲染和GPU非帧缓冲区渲染统称为离屏渲染。CPU和帧缓冲区是为了图形图像显示做了高度优化的,速度较快。
4. 什么情况下会触发离屏渲染? *用CoreGraphics的CGContext绘制的 *在drawRect中绘制的,即使drawRect是空的 *Layer具有Mask(比如圆角)或者shadow *Layer的隔栅化shouldRasterize为True,文本(UILable,UITextField,UITextView,CoreText,UITextLayer)
5. 离屏渲染一定会引起性能问题吗?
很少会,比如drawRect这个方法,只会在视图进行重新绘制的时候才会调用,
6.参考链接:http://aes.jypc.org/?p=17291
6. Core Animation链接:https://zsisme.gitbooks.io/ios-/content/chapter12/instruments.html