在上一篇《纯手绘的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”也有道理。
以上内容为草记,主要便于自己理解。目前理解的层次有限,暂不奢求对外人有多少帮助。
本文详细解析了MyGUI系统中Widget和SubWidget的相互关系及渲染流程,通过手工绘制的草图,揭示了两者之间的联系,深入理解了Widget的创建、皮肤资源加载、RootWidgets与LayerNode的连接以及最终的渲染过程。
129

被折叠的 条评论
为什么被折叠?



