纯手绘的MyGUI创建Widget流程图
在上一篇《纯手绘的MyGUI类图、渲染流程图》文中,我大概走通了MyGUI的渲染流程,知道所有渲染动作都发生在BaseManager.drawOneFrame()里面,起点是ISubWidget,它生成顶点数据到VertexBuffer,经过LayerManager旗下的层层转发,最终喂入IDirect3DDevice9.DrawPrimitive()。可是MyGUI系统内的另一个非常重要的对象Widget,虽然也是和SubWidget同样挂职在LayerNode旗下,初看上去却似乎是孤立于渲染流程之外,还没看到Widget和SubWidget两者的逻辑联系(把SubWidget理解为Child Widget显然是错误的。) 我(liigo)手工绘制的下面两幅草图,基本上打通了Widget和SubWidget相互之间连络的任督二脉。
Widget.createWidget, SkinItem._createSkinItem, LayerItem.attchToLayerItemNode:
Widget继承自SkinItem,SkinItem又继承自LayerItem,所以,Widget IS-A SkinItem,并且 IS-A LayerItem。
图中所示的所有动作都发生在Widget.createWidget()内部。其中兵分两路:一路加载皮肤资源XML、创建ISubWidgets并记录在Widget对象内部;一路将Root Widgets附体到用户指定的Layer(为每个Root Widget(窗口)单独创建一个LayerNode,将来Child Widgets则附体至该LayerNode)、依据先前创建的ISubWidgets生成DrawItem(to RenderItem)并附体至LayerNode。ISubWidget是Widget内负责渲染的子部门,从这个意义上说,其中的“Sub”也有道理。
以上内容为草记,主要便于自己理解。目前理解的层次有限,暂不奢求对外人有多少帮助。