本文主要是介绍使用Instrument调试界面卡顿,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
来自Leo的原创博客,转载请著名出处
我的StackOverflow
我的Github,欢迎Follow
https://github.com/LeoMobileDeveloper
前言
工欲善其事,必先利其器。Instrument对于iOS开发来说,是发现并且解决问题的一把利器。
本文会用到的两个工具包括:
- Time Profiler(获取代码运行时间,一般用来看CPU占用)
- Core Animation(获取图形绘制情况,FPS,离屏渲染等)
本文使用的XCode 版本7.3.1,源代码是Swift 2.2写的
界面显示的原理
iOS设备通常是60fps(每秒60帧),也就是说两帧相隔的时间是1/60秒,大概16.7ms。在这16.7ms中,为了显示一帧,需要如下工作
- CPU计算好各个视图的位置,大小,对图片进行解码等,绘制成纹理交给GPU
- GPU对收到的纹理进行混合,顶点变换,渲染到帧缓冲区
- 每16.7ms,一个时钟信号到达,帧缓冲区取出一帧,显示到屏幕。
也就是说,CPU或者GPU被大量占用的时候,都有可能在16.7ms中没办法完成一帧的绘制,导致时钟信号到来的时候,取得还是上一帧的内容,也就都有可能导致界面卡顿
离屏渲染
在iOS中,渲染通常分为CPU和GPU渲染两种,而GPU渲染又分为在GPU缓冲区和非GPU缓冲区两种
- CPU渲染(软件渲染),CPU绘制成bitmap,交给GPU
- GPU渲染(硬件渲染)
- GPU缓冲区渲染
- 非GPU缓冲区渲染(额外开辟缓冲区)
通常,CPU渲染,和GPU非帧缓冲区内渲染统称为离屏渲染。因为,CPU和帧缓冲区是为图形图像显示做了高度优化的,速度较快。
什么情况下会触发离屏幕渲染?
- 用CoreGraphics的CGContext绘制的
- 在
drawRect
中绘制的,即使drawRect
是空的 - Layer具有
Mask
(比如圆角)或者
这篇关于使用Instrument调试界面卡顿的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!