1. 程式人生 > >Gamebryo 與 CEGUI 一點知識

Gamebryo 與 CEGUI 一點知識

 
 Gamebryo遍歷子結點


    for (NiUInt32 i = 0; i < pkNode->GetArrayCount(); ++i)
        DoSomething(pkNode->GetAt(i);
    for (NiUInt32 i = 0; i < pkNode->GetChildCount(); ++i)
        DoSomething(pkNode->GetAt(i);
    兩段程式碼,天壤之別,前者正確,後者錯誤。由於GB在DetachNode時不刪除結點而只是置空,被刪除結點仍然佔據一個位置而被GetAt()訪問到,所以後者可能導致遍歷不到很多結點。

 Gamebryo座標系

    Gamebryo中貌似預設Y軸為上方向,X軸為右方向,Z軸為前方想;而矩陣相乘,貌似誰在前就採取誰的座標系。

 Gamebryo和Unicode
    Gamebryo同時提供顯示二位元組的Unicode字元(UTC-2)和Ascii字元的支援。
    UnicodeCharacterSets例子裡展示了這種支援。程式可以從NFF檔案中獲取字型資訊生成NiFont物件。NFF檔案可以通過NiFontCreator建立。
    儘管如此,Gamebryo裡的其他字串,比如檔名,檔案路徑,物件名稱等,仍然是Ascii編碼。
    而且,通過定義UNICODE或_UNIOCDE巨集來定製Gamebryo是不被支援的。

 Ni2DBuffer VS NiPixelData

    Ni2DBuffer和NiPixelData的區別在於,Ni2DBuffer儲存於視訊記憶體中,而作為Gamebryo裡最主要的紋理資料(紋理檔案系統大多數都通過這種資料型別操作紋理),NiPixelData儲存於記憶體中。

 使用CEGUI


    使用CEGUI需要實現其Texture和Renderer兩個介面。其中Renderer要實現其addQuad()方法,而Texture要實現其loadFromFile()和loadFromMemory()方法。

 CEGUI使用類成員函式作為回撥函式的辦法


    類成員函式作為回撥函式一般會宣告該成員函式為static,之後採用類似全域性函式一樣的呼叫方法來使用;
    CEGUI則使用普通的類成員函式作為回撥函式。要求傳入該類的指標,以及成員函式的指標,之後做類似“類->函式()”這樣的呼叫。而與第一種方法不同的是,後者需要儲存一份類成員的指標,由於各個類不盡相同,所以採用一個模板物件用來進行儲存。在這裡,CEGUI使所有的模板物件首先繼承自一個純虛介面,之後管理器中儲存介面指標即可。這樣就達到了儲存不同模板物件的目的。非常取巧。

 CEGUI渲染


 CEGUI在每個視窗儲存一份待渲染的RenderCache物件,該物件裡維護了一份渲染所需的影象列表和文字列表,分別對應視窗的圖素和文字。
 渲染時,由影象(image)上溯到影象集(imageset)進而得到實體的Texture並通過它呼叫addQuad完成渲染。
 文字在渲染時被轉換成一張一張圖片,之後按照上述方法進行渲染。由於在解析文字時,CEGUI以換行符'/n'作為換行標誌,所以可以看成一塊文字其實就是以'/n'為分隔的一排排小張圖片渲染而成的。由文字得到影象的方法見font類的getGlyphData()函式。這個過程涉及到從記憶體建立圖片,因此所有希望使用CEGUI字的程式,都需要實現其Texture的loadFromMemory()方法。

 Gamebryo Alpha Blending


    Gamebryo中帶有AlphaProperty的物體會在繪製時將自身畫素點與螢幕上對應的畫素點按照指定方式進行Alpha混合。

 CEGUI Property


    CEGUI以字串作為類屬性Property的索引,同時CEGUI通過Property的方式提供一種無差別訪問物件屬性(get/setProperty)的一種方法。例如,繼承自PropertySet的Window中包含有d_windowRender和d_lookNFeel成員,外部要訪問這兩個成員,一般不通過呼叫getWindowRender或者getlookNFeel這樣的方法;而是通過Window中同時包含的靜態成員d_windowRenderProperty和d_lookNFeelProperty,利用其(靜態)方法得到/更改對應這兩個成員的字串。這種方法的代價是,字串作為索引可能在效能方面有所下降。