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的 重要的類
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.