Ogre的Manager真是多啊,就象個官僚公司,干事的沒幾個,一堆的Manager,個個丫還都是Singleton.說自己是Singleton卻又public構(gòu)造函數(shù),讓人來new它.在第1次被new的時候,偷偷地將this賦給靜態(tài)成員ms_Singleton,第2次new它就要assert喊冤了,當(dāng)然這都是叫Singleton的模板基類的那個構(gòu)造函數(shù)干的(典型的小人行徑,見不得光).Manager一多,本來不復(fù)雜的事,也變得復(fù)雜了.
1.LogManager
a.全局單體LogManager組合Log指針Map集合,控制有多個Log對象,1個Log對象表達對一個Log文件的輸入(老一套).
b.同時LogManager維護1個當(dāng)前默認主事的Log對象mDefaultLog,以展現(xiàn)Log對象功能而隱藏自己實際是個Manager的身份(邀功自賞,其心可誅).
c.維護一個監(jiān)控者接口LogListener列表,以履行作為一個Manager受外部監(jiān)督的職責(zé)(實為推清責(zé)任).
2.DynLibManager
a.全局單體DynLibManager組合DynLib*指針Map集合,控制多個DynLib對象,1個Dynlib表達對動態(tài)庫的裝載和卸載(典型的官僚主義,人浮于事,這點屁事都要有Manager).
3.ResourceGroupManager
? a.全局單體ResourceGroupManager組合ResourceManager指針Map?Manager的Manager,靠,好大的官)
? b.一上任就安插了個親信Manager,建立個叫General的ResourceManager.
4.SceneManagerEnumerator
? a.連它都是系統(tǒng)單體,一個迭代器,小人得志啊,不說了,它可管著一堆SceneManager,惹不起.
? b.一開始就安排了什么事都作不了的SceneManager(基類)作默認SceneManager,大事小事都是它,室內(nèi)室外一手包.
5.一堆中層干部,一堆的MaterialManager,MeshManager,ParticleSystemManager,SkeletonManager......,都是Singleton,有的還是ResourceManager的門生,一開始都干了2件事.
a.定名分:向ResourceGroupManager注冊說自己是某方面的Manager,_registerResourceManager.
b.要資源:向ResourceGroupManager要求控制對某種腳本的解析_registerScriptLoader(就是瓜分資源).
c.有個OverlayManager,ArchiveManager最牛,手下還有幾個工廠給它干活,無非是自己作不了,又推給下級.
6.一堆插件外勞,開始加載,這些外勞到系統(tǒng)中來當(dāng)然要注冊.
7.透明實體mTransparentObjects按z序排序,不透明實體按material分組.
8.我一開始認為Materail是個很聰明的概念,后來才發(fā)現(xiàn)上當(dāng)受騙了,它管理了mTechniques數(shù)組,而Techniche管理了mPasses數(shù)組(Multipass render),最后實質(zhì)的內(nèi)容在Pass類中,Pass類表達了一個渲染的環(huán)境.由于這個官僚系統(tǒng)實在太官僚,所以按對象每次渲染是不可接受的(跨部門合作太多,相互扯皮),渲染狀態(tài)切換頻繁,效率極低,透明渲染z序混亂.所以需要按Materail分組和z軸分序,而RenderSystem的最重要方法接受RenderOperation參數(shù).
9.Pass和RenderOperation是兩位最能干的勞動人民,都是受人管制的對象,整個系統(tǒng)的靈魂和核心,Pass封裝了最重要的渲染狀態(tài)(即進行g(shù)lDrawXXX時管線所處的狀態(tài),著色系統(tǒng)),RenderOperation封裝了帶紋理幾何渲染操作(glDrawElements幾何系統(tǒng)),兩者構(gòu)成一個完整的渲染.即,先,調(diào)用SceneManager的setPass(在其中其仍將調(diào)用RenderSystem以設(shè)置管線狀態(tài)),再,調(diào)用RenderSystem的_render.
10.SceneManager的虛方法_findVisibleObjects是場景管理的核心,由它將Renderable分組,分透明和不透明分送入不同的渲染隊列,Renderable組合RenderOperation和Pass(但出頭的都是Materail),然后SceneManager對之排序,整理,送入RenderSystem渲染.
11.SceneManager的_renderScene是基本渲染核心,它完成若干任務(wù)
?? a.幀動畫驅(qū)動_applySceneAnimations
?? b.場景圖更新_updateSceneGraph
?? c.渲染隊列更新,_findVisibleObjects更新主場景,_queueOverlaysForRendering更新上層主界面,_queueSkiesForRendering更新天空盒,最后_renderVisibleObjects.
12.渲染隊列RenderQueue,維護std::map<RenderQueueGroupID, RenderQueueGroup*>對象,以表達其內(nèi)部的多個方面(世界,前景,背景)的渲染分隊列.RenderQueueGroup再往下分std::map<ushort, RenderPriorityGroup*, std::less<ushort> >,以表達其(如前景)內(nèi)部按ushort優(yōu)先級維護渲染分隊列.RenderPriorityGroup維護一個mTransparentPasses,若干個SolidRenderablePassMap.