性能问题是开发到后期一直要做的东西。现在我在着手准备一个新的项目,由于是菜鸟,对于一些性能相关的一直没有深入的了解过,在前期的准备过程中,一点点积累,一点点探寻。我所记载的是在我在这方面的一些研读,对于文章的搬运,摘抄。我只是知识的搬运工。
是圆角设置的时候,单独使用clipsToBounds 和setCornerRadius是没有问题的,但是放在一起的时候会触发离屏渲染,耗费性能。如果你当前一个页面上有十几个头像这样设置了圆角会明显的卡顿。
名词解释
什么是离屏渲染??
OpenGL中,GPU屏幕渲染有以下两种方式: On-Screen Rendering 意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。 Off-Screen Rendering 意为离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。
相比于当前屏幕渲染,离屏渲染的代价是很高的,主要体现在两个方面: 创建新缓冲区 要想进行离屏渲染,首先要创建一个新的缓冲区。 上下文切换 离屏渲染的整个过程,需要多次切换上下文环境:先是从当前屏幕(On-Screen)切换到离屏(Off-Screen);等到离屏渲染结束以后,将离屏缓冲区的渲染结果显示到屏幕上有需要将上下文环境从离屏切换到当前屏幕。而上下文环境的切换是要付出很大代价的。
如何触发离屏渲染
custom drawRect: (any, even if you simply fill the background with color)
CALayer corner radius
CALayer shadow
CALayer mask
any custom drawing using CGContext
解决方法:
圆角使用UIImageView来处理。
简单来说,底层铺一个UIImageView,然后用GraphicsContext生成一张带圆角的图。
这样,就可以避免在大量cell离屏渲染的时候拖慢fps。
当然,如果只是一两个view有圆角的需求,你大可不必这么折腾。直接设置layer.cornerRadius就可以了。
这里推荐一个封装好的类:JMRoundedCorner。可以方便使用 。
其原理为:如果需要给视图的图像绘制圆角,如UIImageView.image和的UIButton的背景图片。则可以用GraphicsContext绘制一张带圆角的形象给视图来避免离屏渲染。