cocos creator2.1渲染流程分析

作者: 正向反馈 | 来源:发表于2019-07-11 14:19 被阅读13次

    核心类与属性

    InputAssembler
      _vertexBuffer
      _indexBuffer
      _primitiveType
      _start
      _count
    BaseRenderData
      material
      vertexCount
      indiceCount
    RenderData extends BaseRenderData
      _data
      _indices
      _pivotX
      _pivotY
      _width
      _height
      uvDirty
      vertDirty
    IARenderData extends BaseRenderData
      ia
    
    assembler
      useModel
      datas
    
    SimpleSpriteAssembler
      useModel:false
      updateRenderData
      fillBuffers
      createData
      updateVerts
    

    组件持有_assembler_renderData
    _renderDataInputAssembler都是数据容器,_assembler是数据操作
    _assembler可以创建和updateRenderData,更新verts。
    InputAssembler是在渲染时用到的,用于组织传入GPU的数据。
    在渲染时,
    core\renderer\index.js: render(scene) (渲染入口)
    => render-component-walker.visit (遍历所有的render-component)
    => render-flow.render (构建渲染数据)
    => render-component-walker._commitComp
    => assembler.fillBuffers 将顶点坐标数据、uv数据和颜色数据添加到buffer后。核心点!此处是_assembler、_renderData和InputAssembler三者发生关系的地方

    似乎buffer只创建了4个:

    quadBuffer
    meshBuffer
    quadBuffer3D
    meshBuffer3D
    默认的buffer是quadBuffer. InputAssembler记录当次渲染用到的:

    ia._vertexBuffer = buffer._vb  // 顶点缓冲区
    ia._indexBuffer = buffer._ib   //索引缓冲区
    ia._start = indiceStart    //索引开始偏移
    ia._count = indiceCount //索引数量
    

    合并DrawCall

    render-component-walker._commitComp函数,会比较组件的_material._hashrender-component-walker.material._hash,如果不同,会调用 _flush函数,新建InputAssembler,新建Model, 前后的component就在不同的渲染批次中了

    问题来了

    BaseRenderData.material 到底是用在什么地方?
    官方人员的github项目heartfelt项目中,更新材质用了以下代码:

       this._material.updateHash();
       this.target._material = this._material;
       this.target._renderData._material = this._material;   
    

    最后一行的意义是? 是不是版本不同的关系?

    相关文章

      网友评论

        本文标题:cocos creator2.1渲染流程分析

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