一直觉得很多离屏渲染的文章说得不明不白。
问题1:离屏渲染是时刻存在着,还是页面滚动的时候才存在着。
看了很多文章,结合instrument测试fps谈谈我的理解。
instrument测试fps的时候,只有滑动scrollView的时候,fps才会大于0,不滑动的时候fps等于0。我把这特性理解为:只有屏幕显示的内容是动态的时候,GPU才会渲染。渲染又分屏幕渲染和离屏渲染,离屏渲染耗费的性能要更大,因为要创建一个新的缓冲区,并进行上下文切换(这两步才是最耗性能的两步),所以过多的离屏渲染操作(例如cornerRadius+masksToBounds操作)就会产生卡顿。所以我理解为离屏渲染是在页面内容在刷新的时候(例如滑动scrollView、tableview.reloadData,DrawRect绘制等操作)才存在着。
然后,当设置shouldRasterizep属性为YES的时候,耗时的图层绘制会被缓存,如果对应的layer及其sublayers没有发生改变,在下一帧的时候可以直接复用。
问题来了,如果页面不滚动,fps等于0,就不会有下一帧,缓存就用不上,那么我缓存的图层有什么用?后来我想明白了,例如tableview.reloadData,DrawRect等方法重新绘制页面,刷新页面,如果对应的layer及其sublayers没有发生改变,就能使用缓存,如果改变了,就会再生缓存,反而加大性能的损耗。所以设置shouldRasterizep属性为YES需谨慎
网友评论