NGUI原始碼分析 二 UIWidget

2021-07-31 11:25:40 字數 1669 閱讀 3344

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)

//是否有丁點

if (geometry.hasvertices)

//把當前的頂點座標 轉換為相對于父pane的頂點座標

mmoved = false;

return true; }

return hadvertices; }

else if (geometry.hasvertices)

二.  onfill() 方法,填充頂點資訊:計算出頂點資訊,然後把頂點資訊填充到geometry裡面,不過在這裡onfill是空的.因為每種元件計算頂點的方式都不一樣,所以onfill由子類來實現.任何幾何和渲染屬性(比如錨點,大小,顏色,alpha,位置)發生變化,都會導致這個方法被呼叫,通常這個方法也是最消耗cpu的.特別是一些tween動畫會導致onfill反覆呼叫,所以建議附加在ui上的動畫時間不宜過長。感覺這個地方優化空間還是挺大的。

uigeometry:用來儲存頂點資訊的類,這個類很簡單,主要屬性有:

public betterlistverts = new betterlist();//儲存頂點位置資訊

public betterlistuvs = new betterlist();//儲存uv座標

public betterlistcols = new betterlist();//儲存顏色資訊

二 LinkedList原始碼分析

二 linkedlist原始碼分析 上篇看了下arraylist原始碼,這篇記錄下linkedlist原始碼分析 linkedlist 繼承 abstractsequentiallist 提供了對元素順序訪問的抽象 linkedlist 實現 deque介面,底層構成雙向鍊錶結構 linkedlis...

Spring原始碼分析(二)

針對spring中bean初始化時擴充套件類執行順序進行分析 通過getbean逐層最終到bean例項化前後呼叫的方法,主要是aware介面 beanpostprocessor initializingbean init method的呼叫順序 abstractbeanfactory dogetbe...

Jquery原始碼分析 二)

prk 2008 08 12 型別 說明 dom element 第乙個引數為dom元素,第二個引數不用。直接把dom元素存在新生成的jquery物件的集合中。返回這個jquery物件。構建jquery物件完成。string 第乙個引數為string有三種情況 1 html的標籤字串,html ar...