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的 重要的類