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