NGUI渲染组件基类:UIWidget

一、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更新时调用。
  1. 坐标更新UpdateTransform:调用SetDimensions设置mMoved=true或trans.hasChanged=true时,会重新计算并更新左下、右上角的坐标mOldV0、mOldV1,并通知调用UpdateVisibility。
  1. alpha更新:分三步
  • 计算widget的透明度:bool vis =(w.CalculateCumulativeAlpha(frame) > 0.001f);
  • 计算widget是否被panel裁剪:UIPanel.IsVisible(w);
  • 更新mIsVisibleByAlpha、mIsVisibleByPanel状态。
  1. geometry更新:
  • 如果透明度和显示状态变化,调用子类实现的OnFill方法填充geometry。
  • 调用geometry.ApplyTransform转换顶点坐标。
  1. 如果mMoved或mChanged(移动、显示状态变化)为true,通知所属的drawCall更新自己。
原文地址:https://www.cnblogs.com/wang-jin-fu/p/13509001.html