Cocos Creator随笔-生活工作点滴cocos2dx

cocos creator2.1渲染流程分析

2019-07-11  本文已影响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;   

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

上一篇下一篇

猜你喜欢

热点阅读