轉貼 Ogre的官僚主義批判

2021-09-08 23:36:44 字數 2273 閱讀 9859

ogre的manager真是多啊,就象個官僚公司,幹事的沒幾個,一堆的manager,個個丫還都是singleton.說自己是singleton卻又public建構函式,讓人來new它.在第1次被new的時候,偷偷地將this賦給靜態成員ms_singleton,第2次new它就要assert喊冤了,當然這都是叫singleton的模板基類的那個建構函式幹的(典型的小人行徑,見不得光).manager一多,本來不複雜的事,也變得複雜了.

1.logmanager

a.全域性單體logmanager組合log指標map集合,控制有多個log物件,1個log物件表達對乙個log檔案的輸入(老一套).

b.同時logmanager維護1個當前預設主事的log物件mdefaultlog,以展現log物件功能而隱藏自己實際是個manager的身份(邀功自賞,其心可誅).

c.維護乙個監控者介面loglistener列表,以履行作為乙個manager受外部監督的職責(實為推清責任).

2.dynlibmanager

a.全域性單體dynlibmanager組合dynlib*指標map集合,控制多個dynlib物件,1個dynlib表達對動態庫的裝載和解除安裝(典型的官僚主義,人浮於事,這點屁事都要有manager).

3.resourcegroupmanager

a.全域性單體resourcegroupmanager組合resourcemanager指標map?manager的manager,靠,好大的官)

b.一上任就安插了個親信manager,建立個叫general的resourcemanager.

4.scenemanagerenumerator

a.連它都是系統單體,乙個迭代器,小人得志啊,不說了,它可管著一堆scenemanager,惹不起.

b.一開始就安排了什麼事都作不了的scenemanager(基類)作預設scenemanager,大事小事都是它,室內室外一手包.

5.一堆中層幹部,一堆的materialmanager,meshmanager,particlesystemmanager,skeletonmanager......,都是singleton,有的還是resourcemanager的門生,一開始都幹了2件事.

a.定名分:向resourcegroupmanager註冊說自己是某方面的manager,_registerresourcemanager.

b.要資源:向resourcegroupmanager要求控制對某種指令碼的解析_registerscriptloader(就是瓜分資源).

c.有個overlaymanager,archivemanager最牛,手下還有幾個工廠給它幹活,無非是自己作不了,又推給下級.

6.一堆外掛程式外勞,開始載入,這些外勞到系統中來當然要註冊.

7.透明實體mtransparentobjects按z序排序,不透明實體按material分組.

8.我一開始認為materail是個很聰明的概念,後來才發現上當受騙了,它管理了mtechniques陣列,而techniche管理了mpasses陣列(multipass render),最後實質的內容在pass類中,pass類表達了乙個渲染的環境.由於這個官僚系統實在太官僚,所以按物件每次渲染是不可接受的(跨部門合作太多,相互扯皮),渲染狀態切換頻繁,效率極低,透明渲染z序混亂.所以需要按materail分組和z軸分序,而rendersystem的最重要方法接受renderoperation引數.

9.pass和renderoperation是兩位最能幹的勞動人民,都是受人管制的物件,整個系統的靈魂和核心,pass封裝了最重要的渲染狀態(即進行gldraw***時管線所處的狀態,著色系統),renderoperation封裝了帶紋理幾何渲染操作(gldrawelements幾何系統),兩者構成乙個完整的渲染.即,先,呼叫scenemanager的setpass(在其中其仍將呼叫rendersystem以設定管線狀態),再,呼叫rendersystem的_render.

10.scenemanager的虛方法_findvisibleobjects是場景管理的核心,由它將renderable分組,分透明和不透明分送入不同的渲染佇列,renderable組合renderoperation和pass(但出頭的都是materail),然後scenemanager對之排序,整理,送入rendersystem渲染.

12.渲染佇列renderqueue,維護std::map物件,以表達其內部的多個方面(世界,前景,背景)的渲染分佇列.renderqueuegroup再往下分std::map>,以表達其(如前景)內部按ushort優先順序維護渲染分佇列.renderprioritygroup維護乙個mtransparentpasses,若干個solidrenderablepassmap.

OGRE 最小ogre程式的流程

總結一下最小ogre程式的流程 1 建立ogre root 2 用ogre root載入外掛程式,必須載入的是場景管理器和渲染器 3 呼叫ogre resourcegroupmanager getsingleton addresourcelocation來設定資源搜尋路徑 ogre的資源管理很智慧型...

Ogre 學習的歷程

我的瑞士留學 生活之到達並感受著 我去瑞士留學 時飛機的故障,迫使飛機反航。我就這樣一直坐在窗邊看著飛機放油,40噸航空油,在空中足足放了1個多小時。最終,當所有的油放光後,飛機在機長的高超駕駛技術下,安全著陸了。著陸的一瞬間,全機乘客爆發出熱烈的掌聲,表示對機長的感謝。我的心也終於不再空白,也是由...

Ogre的多執行緒

以ogre lock mutex name 為例。查詢得到以下巨集定義。threading ogrethreaddefinesboost.h define ogre lock mutex name boost recursive mutex scoped lock ogrenamelock name...