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
_renderData
和InputAssembler
都是数据容器,_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._hash
与render-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;
最后一行的意义是? 是不是版本不同的关系?