Qter 发表于 2023-3-21 18:37:46

离屏渲染(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③,最后显示在屏幕上。
常见触发离屏渲染情况


//upload-images.jianshu.io/upload_images/3674086-62e3a50a6b8c76ba.png

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

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


//upload-images.jianshu.io/upload_images/3674086-937d1a78212c21f3.png

YYImage圆角处理


//upload-images.jianshu.io/upload_images/3674086-f26731dbec8b1a4e.png

处理方案1.png



//upload-images.jianshu.io/upload_images/3674086-c0ad6cb269e0b684.png

处理方案2.png



//upload-images.jianshu.io/upload_images/3674086-36c6dd518db0012f.png

处理方案3.png

文章推荐



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

页: [1]
查看完整版本: 离屏渲染(Off Screen Rendering)及处理方法