zoukankan      html  css  js  c++  java
  • iOSUI的绘图事务--Core Animation Pipeline--BackBoard(render server)

    Core Animation Pipeline 流水线

    在 iOS上,动画和视图的渲染其实是在另外一个进程做的(下面我们叫这个进程 render server),在 iOS 5 以前这个进程叫 SpringBoard,在 iOS 6 之后叫 BackBoard。

    显示逻辑

    • 1、CoreAnimation提交会话,包括自己和子树(view hierarchy)的layout状态等;
    • 2、RenderServer解析提交的子树状态,生成绘制指令;
    • 3、GPU执行绘制指令;
    • 4、显示渲染后的数据;

     
    image

    Core Animation的绘制是通过Core Animation Pipeline实现,它以流水线的形式进行渲染,具体分为四个步骤:

    • Commit Transaction:

      可以细分为

      • Layout: 构建视图布局如addSubview等操作
      • Display: 重载drawRect:进行时图绘制,该步骤使用CPU与内存
      • Prepare: 主要处理图像的解码与格式转换等操作
      • Commit: 将Layer递归打包并发送到Render Server
    • Render Server:

      负责渲染工作,会解析上一步Commit Transaction中提交的信息并反序列化成渲染树(render tree),随后根据layer的各种属性生成绘制指令,并在下一次VSync信号到来时调用OpenGL进行渲染。

    • GPU:

      GPU会等待显示器的VSync信号发出后才进行OpenGL渲染管线,将3D几何数据转化成2D的像素图像和光栅处理,随后进行新的一帧的渲染,并将其输出到缓冲区。

    • Dispaly:

      从缓冲区中取出画面,并输出到屏幕上。



    作者:Dywane
    链接:https://www.jianshu.com/p/4174559d1ab7
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处
     

    commit transaction

    这个阶段是影响开发者最深的,它本身是由4个阶段组成的:

    layout: 建立(set up)views,会调用重载的layoutSubviews方法,这里会发生view的创建,以及通过addSubview将layers添加进view层级中,将内容聚集起来,并做一些轻量的数据库查找(因为不能在这里停留太久,轻量级的操作可以是本地化字符串的查找以供应label的layout),这个过程通常是CPU密集型或者I/O密集型,关键词 layoutSubviews, view creation,addSubview,populate content, database lookups

    display: 绘制views,这个阶段是如果drawRect有重载的话会通过drawRect绘制内容或者做字符串绘制,需要注意的是这个阶段实际上是CPU或者内存密集型的,由于这里是用core graphics渲染,所以通常用CGContext来渲染,也要避免在这里有过多的耗时  关键词 drawRect, string drawing

    prepare commit:做一些额外的Core Animation工作,比如图像解码和图像转换,图像解码很容易理解,如果view层级中有图片,则会在这个阶段进行JPEG/PNG的解码,图像转换只是在存在有GPU不支持的图像时才会发生,典型的场景是对位图进行索引以避免特定的图像类型     关键词是image decoding,image conversion

    commit:打包layers并提交给render server,这个过程是递归的,所以需要确保view树的平整以确保高效  关键词:package up layers and send to render server, recursive,expensive is layer tree is complex

    how animations are produced

     
    animation process

    动画本身是一个三阶段的处理过程 ,两个在应用内,最后一个阶段在render server中,

    第一个阶段是建立动画,更新view层级 通常是animateWithDuration:animaitons: ;

    第二个阶段是准备及提交动画的阶段,即如上所述的4阶段的commit transaction,唯一不同的地方在于提交阶段,不仅需要提交view层级,也需要提交animation,因为我们需要将animation提交出去给render server以期以后的animation的更新不需要通过IPC与应用进行再次的沟通,这样更高效。



    作者:纵横而乐
    链接:https://www.jianshu.com/p/0bfba3d84cc8
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
     

    1、布局(Layout

    调用layoutSubviews方法;

    调用addSubview:方法;

    会造成CPU和I/O瓶颈;

    2、显示(Display

    通过drawRect绘制视图;

    绘制string(字符串);

    会造成CPU和内存瓶颈;

    每个UIView都有CALayer,同时图层有一个像素存储空间,存放视图;调用-setNeedsDisplay的时候,仅会设置图层为dirty。

    当渲染系统准备就绪,调用视图的-display方法,同时装配像素存储空间。drawrect()

    3、准备提交(Prepare

    解码图片;

    图片格式转换;

    GPU不支持的某些图片格式,尽量使用GPU能支持的图片格式;

    4、提交(Commit

    打包layers并发送到渲染server;

    递归提交子树的layers;

    如果子树太复杂,会消耗很大,对性能造成影响;

    尽可能简化viewTree;

  • 相关阅读:
    标识符
    Bootstrap笔记——Checkbox选项组
    servlet实现简单验证码
    javascript笔记——登录表单验证
    JSP的隐式对象(page,config,pageContext,exception)
    创建Servlet文件不自动生成web.xml原因
    JSP的隐式对象(application)
    前端开发工具——brackets的使用
    《Shell脚本学习 —— Shell变量、字符串、数组、注释》
    《开发板 — 3399pro备份整个文件系统》
  • 原文地址:https://www.cnblogs.com/feng9exe/p/10339821.html
Copyright © 2011-2022 走看看