Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 712|回复: 0
打印 上一主题 下一主题

离屏渲染(Off Screen Rendering)及处理方法

[复制链接]

1228

主题

1996

帖子

7574

积分

认证用户组

Rank: 5Rank: 5

积分
7574
跳转到指定楼层
楼主
发表于 2023-3-21 18:37:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
补充:在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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-4-26 20:09 , Processed in 0.055447 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表