天天看點

3D引擎:Horde3D的 Resource類

Horde3D中 Resource類 和 Scene類時 兩大主要的類。 在形式上,這兩個類有許多共同點。這裡主要講 Resource類。

Resource主要負責加載我們需要的資源,如 執行的渲染流程, 模型,Texture,Shader code等。Resource類裡有一個管理類,專門負責管理需要用到的資源。

主要包括  一個 Resource類:   它是所有Resource檔案的基類

 對于 Resource的管理,需要智能指針,

智能指針類 在C++中,一般對配置設定在堆中的 記憶體需要進行回收。一般,對記憶體的管理,無外乎 以防  :     1  對象引用的記憶體塊提前被釋放掉了,這導緻對象在釋放時引發崩潰     2  指向記憶體的指針,在沒有釋放記憶體時,指向了别的地方,引發記憶體洩漏

智能指針就是預防這兩種情況的, 它通過  記錄對同一記憶體塊的 引用的個數,來預防被引用的記憶體被提前釋放。 同時在指向 其它記憶體塊時,通過指派構造函數,自動減數。

智能指針是一個模闆類, 它裡面有 兩個私有方法:   一個是 addRef, 當你引用該類時,自動增一   另一個是subRef.  當你析構該類時,自動減一

 在構造函數, 複制構造函數裡和 指派構造函數裡,會 調用 addRef

 在析構函數和 指派構造函數 裡 會 調用 subRef

是以,我們在建立了某個類後,實際一般會使用該類的智能指針

—————————————————————————————— ResourceManager類: ResourceManager類主要 是為了管理  遊戲場景中使用的資源類。

ResourceManager的構造函數:    為要管理的資源數量配置設定了空間,即 一個vector變量, _resources

Horde3D中 Resource類型一共分為以下幾種:     SceneGraph ,   Geometry ,   Animation ,   Material ,   Code ,   Shader ,   Texture ,   ParticleEffect ,   Pipeline 對于不同的類型,有其自己的 初始化函數,釋放函數 和 構造函數

這些都對應在 _registry的變量裡,它是一個 map類型

在Horde3D引擎初始化的過程中, 所有的類型會通過注冊函數進行注冊

registerResType:   registerResType 是在引擎初始化時,調用的。 由于采用多态技術,是以,需要為每個類型的資源(Resource的子類) 指定它們的 構造函數,這裡每個類型的資源都通過其factoryFunc函數來構造。

addResourfce(int type, const string &name, int flags, bool userCall):    這個是我們主動将 需要的資源添加到 我們的application裡時調用的函數   type是 我們要添加的資源的類型,   name 是 這個資源的檔案路徑名      如果這個類型的資源已經存在于 _resources裡,那麼就對其 引用_userRefCount加一即可,然後傳回 這個 資源 在 _resources 的序号(計數從1開始,即在vector中的位置+1)  如果沒有,就建立一個該類型的資源,添加到 _resources的 末尾,_userRefCount為1,并調用 addResource(Resource *resource) 函數添加到 _resources

這裡的userCall是指 使用者自動添加的,那些因為指派,複制的 都交給智能指針了。

addResource:   這個就是将我們新建立的Resoource 添加到 _resources中, 因為在構造函數中,為其預留了 100個位置的控件,是以,這裡在添加時,需要判斷是否填滿100個,如果填滿,直接push_back添加後面就行,如果未填滿,就直接數組操作。

removeResource(Resource *resource, bool userCall) 與addResource相對應的就是它了,  這裡的remove 也是指使用者主動調用,自然是對 _userRefCount -1的操作,其餘的也都交給智能指針了。

clear:   它清空 _resources vector數組

queryUnloadedResource(int index):  它是在 從本地檔案中加載資源時,需要調用的函數。  從其實作可以看出,它傳回的是 _resources 中最前面的資源句柄, 且該資源未被加載過(_loaded)也未被詢問過(_noQuery), 在調用時index總為0。

resolveResHandle(ResHandle handle):   它是 根據句柄,在_resources中傳回相應的資源。

析構函數:   它首先調用了 clear方法,清理 _resources中所有資源,然後調用 _registry中注冊的 資源的 releaseFunc。

__________________________________________________________________ Resource類

構造函數:   主要是為該資源 指派 類型_type,路徑名 _name, 初始化句柄 _handle, 是否加載_loaded,  引用數_refCount, 使用者主動添加資源數 _userRefCount , _flags

initDefault:   主要是留給子類的

load :   在父類中,主要是 設定loaded, _noQuery, 即避免同一資源加載兩次, 如果 資源data為空,表明該資源未被通路或加載過。   load函數 的具體執行會放在子類中進行,主要是将本地檔案的内容,解析為實際的資源類。

——————————————————————————

了解了 Resoure類後,我們就可以 去寫 MaterialResource類, 它是我們能夠渲染出Logo的 重要的類