cocos creator2.1渲染流程分析

核心类与属性

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;   

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容