NGUI渲染组件基类:UIWidget
目录:NGUI源码学习
一、UIGeometry:保存了集合图形的顶点信息,包括顶点坐标、uv、颜色值信息,并提供了这些信息的获取方法。这些顶点信息最终会添加到所属UIWidget的UIDrawcall里。
UIGeometry:几何对象数据存储、获取
property:
verts:顶点数组,正常是4个
uvs:纹理
cols:颜色
mRtpVerts:相对panel的顶点
mRtpNormal:相对panel的法线
mRtpTan:相对panel的切线
function:
hasVertices:是否拥有顶点,有顶点才参与绘制
ApplyTransform:计算mRtpVerts、mRtpNormal、mRtpTan
WriteToBuffers:获取mRtpVerts、uvs、cols、mRtpNormal、mRtpTan
二、UIWidget:坐标、透明度、大小的更新,在UIPanel调用。
UILabel、UITexture、UISprite的父类,提供了大部分组件都需要的一些字段,如width、height、depth、color、alpha等等,同时也有一些共同的方法,如较为重要的UpdateGeometry、UpdateTransform等。
UIWidget:UIRect
property:
mChanged:标记当前是否有修改,有修改则更新矩形
mMoved:标记当前位置是否有更改
geometry:几何信息,用来保存顶点,位置,顶点UV,顶点颜色等信息,一对一
drawCall:当前UIWidget所属的DC对象,一对多,一个DC可以包含多个Widget,但一个Widget只能有一个DC。
drawRegion:用来表示一个widget最后渲染的区域(而不改变widget本身的大小)。例如UIProgressBar进度条就是修改的drawRegion而不是width/height。
drawingDimensions:实际显示区域大小
width&height:get;set;宽高
color:get;set;颜色
mIsVisibleByPanel:panel是否可见
mIsVisibleByAlpha:parent是否可见
finalAlpha:最终的alpha值
pivot:get;set;锚点,立即生效,rawPivot是设置标记位mChanged
depth:get;set;相对于父节Panel显示层级,会导致dc重建
raycastDepth:get;最终显示层级,(panel != null) ? mDepth + panel.depth * 1000 : mDepth;并不生效
localCorners/localCenter:get;显示矩形的四个角信息,顺序是:左下,左上,右上,右下
worldCorners/worldCenter:get;显示矩形的四个角信息
material:get;set;材质
mainTexture:get;材质球的贴图
shader:get;材质球的shader
function:
SetDimensions:修改矩形大小
GetSides:获取widget四个边的世界坐标
SetRect:设置矩形的位置、大小
CalculateBounds:bounds包围盒计算
SetDirty:标记需要更新矩形所属的DrawCall
MarkAsChanged:更新矩形以及所属的DrwaCall
OnAnchor:更新矩形大小、坐标,设置mChanged
UpdateVisibility:更新是否可见
UpdateFinalAlpha:更新透明度
UpdateTransform:更新坐标变化
UpdateGeometry:更新geometry信息,调用OnFill
OnFill:填充geometry,任何几何和渲染属性(比如锚点,大小,颜色,Alpha,位置)发生变化,都会导致这个方法被调用。
通常这个方法也是最消耗cpu的。
ConvertToTexCoords:sprite的x,y对应图集的左上角,这边转成(0,1)范围的以左下角起点、相对图集位置的uv点
LateUpdate-UpdateSelf-UpdateDrawCalls
UpdateSelf-UpdateTransformMatrix-UpdateLayers-UpdateWidgets-FillAllDrawCalls-WriteToBuffers
UpdateWidgets-UpdateTransform-UpdateVisibility-UpdateGeometry
UpdateGeometry-OnFill-Fill
- 核心方法调用顺序:UpdateWidgets-UpdateTransform-UpdateVisibility-UpdateGeometry。在UIPanel的LateUpdate更新时调用。
- 坐标更新UpdateTransform:调用SetDimensions设置mMoved=true或trans.hasChanged=true时,会重新计算并更新左下、右上角的坐标mOldV0、mOldV1,并通知调用UpdateVisibility。
- alpha更新:分三步
- 计算widget的透明度:bool vis =(w.CalculateCumulativeAlpha(frame) > 0.001f);
- 计算widget是否被panel裁剪:UIPanel.IsVisible(w);
- 更新mIsVisibleByAlpha、mIsVisibleByPanel状态。
- geometry更新:
- 如果透明度和显示状态变化,调用子类实现的OnFill方法填充geometry。
- 调用geometry.ApplyTransform转换顶点坐标。
- 如果mMoved或mChanged(移动、显示状态变化)为true,通知所属的drawCall更新自己。
一直想把之前工作、学习时记录的文档整理到博客上,一方面温故而知新,一方面和大家一起学习 -程序小白

浙公网安备 33010602011771号