firemail

标题: 离屏渲染(Off Screen Rendering)及处理方法 [打印本页]

作者: Qter    时间: 2023-3-21 18:37
标题: 离屏渲染(Off Screen Rendering)及处理方法
补充:在iOS中,画圆角并不一定不会发生离屏渲染
APP渲染流程:APP在60FPS的屏幕显示时,GPU会从数据存放帧缓冲区,在60帧时间里,循环读取数据并显示
CoreAnimation 渲染
离屏渲染触发原理在APP的一个View中,需要进行额外的渲染和合并时,系统会自动开辟Off-Screen Buffer(离屏缓冲区) 和 FrameBuffer(帧缓冲区)组合搭配渲染,最后才显示在屏幕上,这个过程就触发了离屏渲染。如绘制圆角:一个UIButton中,存在多个Layer层,backgroundColor,backgroundImage,border等,需要都绘制圆角时则就会触发离屏渲染。如果仅仅是对backgroundImage or border 单一Layer绘制圆角,则不会触发离屏渲染
劣势:离屏渲染发生时会需要额外的存储空间,在渲染过程中,系统会在离屏缓冲区、帧缓冲区来回切换上下文进行渲染显示,切换过程就会造成性能损耗,且它有大小限制,为屏幕像素点的2.5倍。
优势及使用场景:
1.提高效率,如果效果需要被多次使用,则可以提前渲染到OffScreenBuffer,方便复用;(但其存在时间也很短,如果超过100ms未被使用,则依然会被释放)
2.需要特殊效果,需要使用额外的OffScreen Buffer保存中间状态时,就不得不使用离屏渲染。
画家算法:渲染图层由远及近的一层一层渲染,就会有多个图层。
而苹果是不建议使用多层次图层,会引发性能问题
绘制多图层圆角的两种渲染逻辑
无离屏渲染时逻辑:在图层渲染subLayer①时,完毕后就会将其从帧缓冲区中丢弃。再绘制subLayer②,画完即丢弃,再绘制subLayer③....最后显示。
离屏渲染逻辑:在图层subLayer①渲染时,会将其存放至OffScreenBuffer,读取出来对其进行圆角处理,再subLayer②存放至OffScreenBuffer,对其做圆角处理,同理subLayer③,最后显示在屏幕上。
常见触发离屏渲染情况




常见触发离屏渲染情况.png

推荐了解YYImage的圆角处理方案,避免离屏渲染的发生




YYImage圆角处理




处理方案1.png





处理方案2.png





处理方案3.png

文章推荐



作者:夏天的枫_
链接:https://www.jianshu.com/p/286ac78dee0f
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。






欢迎光临 firemail (http://firemail.wang:8088/) Powered by Discuz! X3