NGUI源码分析(二) UIWidget

UIWidget是所有UI组件的基类,持有UI组件的大小,锚点,顶点,颜色,Alpha等所有跟渲染相关的属性。

关键属性:
    protected Pivot mPivot //锚点
    protected Color mColor; //颜色
    protected int mWidth;//组件宽度
 
    protected int mDepth = 0;//显示深度,这个深度是相对于父节Panel的
    public UIGeometry geometry;//Geometry对象用来保存顶点,位置,顶点UV,顶点颜色等信息
    public UIDrawCall drawCall;//当前UIWidget所使用的绘制对象
 
    protected bool mChanged = true;//记录所有几何和渲染属性是否发生变化 如果发生变化就要在UpdateGeometry里面重新计算顶点信息
    public bool fillGeometry = true;//是否允许填充顶点信息
 
    public override Vector3[] localCorners //get方法 获得UIWidget的4个顶点的局部坐标,顺序是:左下,左上,右上,右下
    public override Vector3[] worldCorners//get方法 获得UIWidget的4个顶点的世界坐标系坐标,这个方法实际上就是将局部坐标转化为世界坐标
 
关键方法:
 一.UpdateGeometry() 核心方法,更新UI组件的顶点信息。但是这里不并执行渲染,这个方法只是更新了UIWidget渲染所需要的数据,然后Panel会把这些数据传给DrawCall,让DrawCall执行渲染。简单说就是UIWidget负责计算数据,DrawCall把计算好的数据拿来渲染。
部分代码:
 
   //获得通过计算的最终Alpha值,如果不为0要跟上层节点进行混合计算
  float finalAlpha = CalculateFinalAlpha(frame);
   //是否发生了变化
   if (mChanged)
   {
         mChanged = false;
 
        //如果Ahpha值大于最小值
        if (mIsVisibleByAlpha && finalAlpha > 0.001f && shader != null)
       {
            bool hadVertices = geometry.hasVertices;
            //是否允许填充顶点信息
            if (fillGeometry)
            {
                //清空顶点信息
                 geometry.Clear();
 
                //填充顶点信息
                 OnFill(geometry.verts, geometry.uvs, geometry.cols);
            }
            //是否有丁点
            if (geometry.hasVertices)
            {
                 if (mMatrixFrame != frame)
                 {
                     //通过计算得到相当于父Panel的矩阵
                      mLocalToPanel = panel.worldToLocal * cachedTransform.localToWorldMatrix;
                      mMatrixFrame = frame;
                 }
                
                 //把当前的顶点坐标 转换为相对于父Pane的顶点坐标
                 geometry.ApplyTransform(mLocalToPanel);
                 mMoved = false;
                 return true;
        }
        return hadVertices;
   }
   else if (geometry.hasVertices)
   {
        if (fillGeometry) geometry.Clear();
        mMoved = false;
        return true;
  }
 
 二.  OnFill() 方法,填充顶点信息:计算出顶点信息,然后把顶点信息填充到geometry里面,不过在这里OnFill是空的.因为每种组件计算顶点的方式都不一样,所以OnFill由子类来实现.任何几何和渲染属性(比如锚点,大小,颜色,Alpha,位置)发生变化,都会导致这个方法被调用,通常这个方法也是最消耗cpu的.特别是一些Tween动画会导致OnFill反复调用,所以建议附加在UI上的动画时间不宜过长。感觉这个地方优化空间还是挺大的。
UIGeometry:用来保存顶点信息的类,这个类很简单,主要属性有:
 public BetterList<Vector3> verts = new BetterList<Vector3>();//保存顶点位置信息
 public BetterList<Vector2> uvs = new BetterList<Vector2>();//保存UV坐标
 public BetterList<Color32> cols = new BetterList<Color32>();//保存颜色信息

原文地址:http://www.cnblogs.com/rocky300/articles/4675817.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值