美文网首页
iOS知识整理-图像显示优化与离屏渲染

iOS知识整理-图像显示优化与离屏渲染

作者: 皮皮蟹pipixie | 来源:发表于2019-10-08 16:35 被阅读0次

    图像显示原理

    image.png

    1.CPU:输出位图
    2.GPU :图层渲染,纹理合成
    3.把结果放到帧缓冲区(frame buffer)中
    4.再由视频控制器根据vsync信号在指定时间之前去提取帧缓冲区的屏幕显示内容
    5.显示到屏幕上

    CPU工作
    1.Layout: UI布局,文本计算
    2.Display: 绘制
    3.Prepare: 图片解码
    4.Commit:提交位图

    GPU渲染管线(OpenGL)
    顶点着色,图元装配,光栅化,片段着色,片段处理

    UI卡顿掉帧原因

    一般来说,页面滑动流畅是60fps,也就是1s有60帧更新,即每隔16.7ms就要产生一帧画面,而如果CPU和GPU加起来的处理时间超过了16.7ms,就会造成掉帧甚至卡顿。

    滑动优化方案

    CPU:把以下操作放在子线程中
    1.对象创建、调整、销毁
    2.预排版(布局计算、文本计算、缓存高度等等)
    3.预渲染(文本等异步绘制,图片解码,图像绘制等)

    GPU:
    纹理渲染,视图混合,图形生成

    一般遇到性能问题时,考虑以下问题:
    是否受到CPU或者GPU的限制?
    是否有不必要的CPU渲染?
    是否有太多的离屏渲染操作?
    是否有太多的图层混合操作?
    是否有奇怪的图片格式或者尺寸?
    是否涉及到昂贵的view或者效果?
    view的层次结构是否合理?

    离屏渲染

    一般情况下,都是在当前显示屏幕缓冲区中进行的,但是当有圆角等特殊情况时,此时在屏幕缓冲区中无法进行渲染,需要生成一个新的缓冲区中进行渲染,然后绘制到屏幕缓冲区,这个过程需要进行上下文切换,会消耗很多资源。而且这个过程每一帧都会进行。

    会触发离屏渲染的操作:

    shouldRasterize(光栅化)
    masks(遮罩)
    shadows(阴影)
    edge antialiasing(抗锯齿)
    group opacity(不透明)
    圆角(当和maskToBounds一起使用时)
    渐变
    Text(UILabel, CATextLayer, Core Text, etc)...

    参考:iOS-离屏渲染详解
    参考:iOS-图像显示优化

    相关文章

      网友评论

          本文标题:iOS知识整理-图像显示优化与离屏渲染

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