美文网首页
渲染 Rendering

渲染 Rendering

作者: infoyou | 来源:发表于2019-06-20 15:11 被阅读0次

在进行iOS的性能优化中,会碰到卡顿的问题,虽然iOS设备的性能越来越高,但是卡顿的问题还是有可能会出现,而离屏渲染是造成卡顿的原因之一。


为什么要有离屏渲染?

显示器显示图像:需要显示的图像经过CRT电子枪以极快的速度一行一行的扫描,扫描出来就呈现了一帧画面,随后电子枪又会回到初始位置循环扫描,形成了我们看到的图片或视频。

为了让显示器的显示跟视频控制器同步,当电子枪新扫描一行的时候,准备扫描的时发送一个水平同步信号(HSync信号),显示器的刷新频率就是HSync信号产生的频率。然后CPU计算好frame等属性,将计算好的内容交给GPU去渲染,GPU渲染好之后就会放入帧缓冲区。然后视频控制器会按照HSync信号逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器,就显示出来了。

离屏渲染的代价很高,想要进行离屏渲染,首选要创建一个新的缓冲区,屏幕渲染会有一个上下文环境的一个概念,离屏渲染的整个过程需要切换上下文环境,先从当前屏幕切换到离屏,等结束后,又要将上下文环境切换回来。这也是为什么会消耗性能的原因了。

由于垂直同步的机制,如果在一个 HSync 时间内,CPU 或者 GPU 没有完成内容提交,则那一帧就会被丢掉,等待下一次机会再显示,而这时显示屏会保留之前的内容不变。这就是界面卡顿的原因。


为什么要避免离屏渲染?

CPU GPU 在绘制渲染视图时做了大量的工作。离屏渲染发生在 GPU 层面上,会创建新的渲染缓冲区,会触发 OpenGL 的多通道渲染管线,图形上下文的切换会造成额外的开销,增加 GPU 工作量。如果 CPU GPU 累计耗时 16.7 毫秒还没有完成,就会造成卡顿掉帧。

圆角属性、蒙层遮罩 都会触发离屏渲染。指定了以上属性,标记了它在新的图形上下文中,在未愈合之前,不可以用于显示的时候就出发了离屏渲染。


不论是在屏渲染还是离屏渲染都是在GPU层面的;

在屏渲染(On-Screen Rendering): 

当前屏幕的渲染, 指的是GPU的渲染操作发生在当前用于显示的屏幕缓冲区中;

离屏渲染(Off-Screen Rendering):

在当前屏幕缓冲区以外新开辟一个缓冲区进行操作;


离屏渲染消耗性能的原因

需要创建新的缓冲区

离屏渲染的整个过程,需要多次切换上下文环境,先是从当前屏幕(On-Screen)切换到离屏(Off-Screen);等到离屏渲染结束以后,将离屏缓冲区的渲染结果显示到屏幕上,又需要将上下文环境从离屏切换到当前屏幕


哪些操作会触发离屏渲染?

光栅化,layer.shouldRasterize = YES

遮罩,layer.mask

圆角,同时设置 layer.masksToBounds = YES、layer.cornerRadius大于0

考虑通过 CoreGraphics 绘制裁剪圆角,或者使用圆角图片

阴影,layer.shadowXXX,如果设置了 layer.shadowPath 就不会产生离屏渲染


Instruments 监测

1)Color Offscreen-Rendered Yellow,开启后会把那些需要离屏渲染的图层高亮成黄色,这就意味着黄色图层可能存在性能问题。

2)Color Hits Green and Misses Red,如果 shouldRasterize 被设置成 YES,对应的渲染结果会被缓存,如果图层是绿色,就表示这些缓存被复用;如果是红色就表示缓存会被重复创建,这就表示该处存在性能问题了。


iOS 版本上的优化

1)iOS 9.0 之前 UIImageView、UIButton 设置圆角都会触发离屏渲染。

2)iOS 9.0 之后 UIButton 设置圆角会触发离屏渲染,而 UIImageView 里图片设置圆角不会触发离屏渲染了,但如果设置其他阴影效果之类的还是会触发离屏渲染的。

相关文章

  • 离屏渲染

    On-Screen Rendering Off-Screen Rendering 界面的渲染过程 渲染过程: 如何...

  • test

    Enzyme Shallow Rendering - 不会渲染子组件DOM Rendering - 渲染子组件 U...

  • 离屏渲染

    On-Screen Rendering 在屏渲染 Off——Screen Rendering 离屏渲染 当我们设置...

  • 渲染 Rendering

    在进行iOS的性能优化中,会碰到卡顿的问题,虽然iOS设备的性能越来越高,但是卡顿的问题还是有可能会出现,而离屏渲...

  • iOS--离屏渲染

    离屏渲染(Offscreen rendering) 离屏渲染的定义 离屏渲染(offscreen-renderin...

  • 翻译练习 react-Rendering Elements

    Rendering Elements渲染组件 Elements are the smallest building...

  • Unity Forward渲染路径(转)

    Unity Forward渲染路径Unity3D-Rendering Paths(渲染路径)及LightMode(...

  • 什么是离屏渲染?

    渲染又分为离屏渲染与在屏渲染 ·On-Screen Rendering 意为当前屏幕渲染,指的是GPU的渲染操作是...

  • 网页渲染机制

    渲染引擎及关键渲染路径(Critical Rendering Path) 通过网络模块加载到HTML文件后渲染引擎...

  • 2021iOS面试题总结day3

    准备:1.iOSUI渲染机制 On-Screen Rendering:意为在屏渲染(当前屏幕渲染),指的是GPU的...

网友评论

      本文标题:渲染 Rendering

      本文链接:https://www.haomeiwen.com/subject/ffxjqctx.html