Gamebryo 引擎的RITI機制

2021-05-22 05:11:24 字數 1334 閱讀 8829

一 什麼是riti

通過執行時型別識別(rtti)(run-time type identification),程式能夠使用基類的指標或引用來檢查這些指標或引用所指的物件的實際派生型別,在c++中,riti最大的用處是通過虛函式來實現多型。不過有些時候我們必須在執行時期確切的知道基類指標實際所指的型別,而不是單純的呼叫虛函式。

在vc中,rtti提供了兩個非常有用的操作符:

1:typeid操作符,返回指標和引用所指的實際型別。typeid表示式形如:typeid(expr),這裡expr是任意表示式或者型別名。如果表示式的型別是類型別且至少包含有乙個虛函式,則typeid操作符返回表示式的動態型別,需要在執行時計算;否則,typeid操作符返回表示式的靜態型別,在編譯時就可以計算。

2:dynamic_cast操作符,將基類型別的指標或引用安全地轉換為派生型別的指標或引用。當dynamic_cast用於基類指標時,該指標必須是有效的——要麼是0,要麼是指向乙個物件。如果繫結到引用或指標的物件不是目標型別的物件,則dynamic_cast失敗。如果轉換到指標型別的dynamic_cast失敗,則dynamic_cast的結果是0值;如果轉換到引用型別的dynamic_cast失敗,則丟擲乙個bad_cast型別的異常。因此,dynamic_cast操作符一次執行兩個操作:首先驗證被請求的轉換是否有效,只有當轉換有效時才進行實際轉換。

二 gamebryo中riti類的宣告和定義

為了支援多平台,以及提供乙個更加安全和有效的riti,gb實現了自己的riti機制。在gb中所有具備riti能力的類都必須繼承於ibase介面類,該類不僅提供了riti介面,而且提供了引用計數的介面。每個繼承與ibase的類可以通過巨集來過載riti函式,在標頭檔案中使用ee_declare_class巨集來宣告乙個riti類,並在cpp檔案中使用ee_implement_concrete_class_info來定義。例如我們可以用ee_declare_class1(finalclass, uniqueid, baseclass)來宣告乙個類,第乙個引數是類名,第二個是類的id,這個id是獨一無二的,第三個是該類的基類名。另外我們也可以通過ee_declare_inte***ce來宣告乙個介面類,我們不用在cpp檔案中定義。

三 在gamebryo中使用riti

classid getclassid() 該函式用來獲得類的id。const classinfo* getclassdesc()獲得類的詳細資訊。ee_dynamic_cast可以用來將基類型別的指標安全地轉換為派生型別的指標。ee_is_kind_of(classname, pobject)巨集用來判斷某個物件是否屬於該類或該類的子類。ee_is_exact_kind_of(classname, pobject)用來判斷某個物件是否屬於該類,但比包括該類的子類。

Gamebryo 遊戲引擎分析(一)整體設計

因為這個引擎是商業引擎,所以,我不會貼上 源 像這樣 class ooxx 但是我會這樣 另 引用請註明出處 blog.csdn.net xjyhust,以及宣告 全部資料來自網際網路,如果對文章內容有意見,請e mail我 xjyhust gmail.com 否則管我鳥事,i just come ...

Gamebryo2 5引擎評估報告

1.gamebryo 2.5 引擎新增特性 1.1.開發工具方面 1.1.1.場景編輯器 1 新增地形編輯功能,被整合到了gamebryo的場景編輯器中 2 支援動態lod 3 可選擇的整合idv speedtree 4 支援貼圖,貼花,碰撞檢測,meta data,基本的變形能力,基本的水的建立。...

gamebryo的Badsushi例子學習

估計是我看的順序不對還是咋的。這個例子實在是包含太多了。搞得我研究了半天。但是發現太多以至於要是把全部弄清楚細節。那可以等到來年花開時。所以大概研究了一下他這個例子的框架和想要表達的主要東西。例子根據使用者指定來產生很多魚。所有魚按照異性的曲線游動。螢幕正中心有乙個nimeshscreeneleme...