Page系統(tǒng)設(shè)計(jì)思想
Steve Streeting
將Page
系統(tǒng)作為Ogre(1.7.2)
的核心組件,其設(shè)計(jì)理念如下:
1. 勿須假定Page系統(tǒng)明確了解世界,世界的新的組成部分不僅具備可以被用于動(dòng)態(tài)加載定義好的數(shù)據(jù)的特性,還必須有被動(dòng)態(tài)"發(fā)現(xiàn)\探索到"的特性.
注:對(duì)原有的世界必須也有個(gè)改進(jìn),讓其具備一定被動(dòng)態(tài)發(fā)現(xiàn)的特性.
2. 允許多策略決定頁(yè)面的生命周期---烏鴉飛行距離路線(xiàn)案例就是一個(gè)很好的印證[1],但我們也必須允許其他策略(尤其是在密集的、閉塞的場(chǎng)景中,它可能是連通或閉塞的區(qū)域狀態(tài))的存在.
3. 將分頁(yè)策略(Paging Strategy)和分頁(yè)內(nèi)容當(dāng)做一個(gè)正交概念對(duì)待,亦即你可以用多種方式混合和匹配組合它們.
4. 勿須假定分頁(yè)是規(guī)則的尺寸,或者分頁(yè)占據(jù)獨(dú)特的、非重疊的空間區(qū)域。
5. 支持設(shè)置多種多樣結(jié)構(gòu)的分頁(yè)。可以是網(wǎng)格的地形,也可以是巖洞結(jié)構(gòu)的'蛇型'區(qū)域。
6. 頁(yè)面之間的過(guò)渡不能有具體類(lèi)型相關(guān)的細(xì)節(jié)信息,關(guān)鍵是需要支持各種不同的場(chǎng)景的過(guò)渡,例如從洞穴結(jié)構(gòu)到二維地形再到空曠空間。
7. 可以在一個(gè)獨(dú)立線(xiàn)程中完成分頁(yè)的加載,不管是在全線(xiàn)程或半線(xiàn)程下都可以用相同的形式將資源作為可用資源來(lái)使用[2]。
8. 分頁(yè)應(yīng)該在物理內(nèi)容變化的時(shí)候支持多重LODs。分頁(yè)中的內(nèi)容可以有自己的LOD,但我們也應(yīng)該允許物理內(nèi)容在更高級(jí)別上也可以發(fā)生變化。
9. 現(xiàn)在還不支持分頁(yè)坐標(biāo)系。為了配合大世界的精細(xì)處理,可以使用雙精度坐標(biāo)系和與攝像機(jī)相關(guān)的渲染方法。頁(yè)面相關(guān)的坐標(biāo)系需要一個(gè)較大的代碼變動(dòng),主席肯定不允許冒這么大的風(fēng)險(xiǎn)把這差事給我這大把年紀(jì)的程序猿去做滴,那就預(yù)留給以后的版本完成。
10. 總的來(lái)說(shuō),對(duì)分頁(yè)系統(tǒng)的支持不能過(guò)分要求場(chǎng)景管理器有太多改動(dòng),公主澤肯定會(huì)不高興滴,那這些就保留到2.0版的時(shí)候再搞吧。
PageManager(頁(yè)面管理器)
主要作用是提供PageStrategy、PageContentFactory這樣的擴(kuò)展類(lèi)的一個(gè)中心注冊(cè)入口,同是也是訪(fǎng)問(wèn)當(dāng)前加載的世界分頁(yè)(PagedWorld)的地方。我還沒(méi)有決定是將其掛在核心的Root下還是讓它作為一個(gè)獨(dú)立庫(kù)讓使用者引用。
PagedWorld(世界分頁(yè))
這個(gè)基本上是整個(gè)結(jié)構(gòu)中的數(shù)據(jù)驅(qū)動(dòng)部分。一個(gè)PagedWorld是世界中內(nèi)容的集合,可以從文件中加載或在代碼中定義。最重要的是,它不需要?jiǎng)?chuàng)建其中的全部東西---頂多需要?jiǎng)?chuàng)建一個(gè)分頁(yè)世界區(qū)域(PagedWorldSections),并且可以在定義了“重生點(diǎn)”的情況下選擇性的創(chuàng)建一個(gè)分頁(yè)入口點(diǎn)(PageEntryPoints,在出現(xiàn)不可能簡(jiǎn)單獲的從一個(gè)相機(jī)的世界位置加載分頁(yè)需要的數(shù)據(jù)源的情況下,這點(diǎn)非常重要)。 用這種適當(dāng)?shù)姆绞剑?qǐng)求就能動(dòng)態(tài)的加載余下需要的部分。
PagedWorldSection(世界分頁(yè)區(qū)域)
這是世界的一個(gè)組成區(qū)域,它符合特定的分頁(yè)策略。例如,室外2D地形區(qū)域(這里的'地形'我的意思是:它在結(jié)構(gòu)上是2D的,而不是指它定義了地形的內(nèi)容)可能會(huì)使用一個(gè)策略,并被限定使用一種方式;室外的天空區(qū)域可能使用另一種策略,一個(gè)復(fù)雜的室內(nèi)區(qū)域可能使用再另一種策略。這里只需要掌握一個(gè)高層次的描述---世界的區(qū)域編號(hào)(section id)、通用邊界信息以及可選的入口點(diǎn)(僅僅包含一個(gè)坐標(biāo)和一個(gè)頁(yè)面標(biāo)識(shí)符 ---在策略缺失而通過(guò)上下文無(wú)法將坐標(biāo)點(diǎn)直接轉(zhuǎn)換成一個(gè)分頁(yè)的情況下尤為重要)
注:Section這里指組成某個(gè)整體的一部分區(qū)域。Space這里指地形上的天空,不是天空盒。
PageStrategy(分頁(yè)策略)
這個(gè)類(lèi)是負(fù)責(zé)決定如何加載和清除分頁(yè),并且可以選選擇僅從世界位置獲得一個(gè)分頁(yè)(和一個(gè)PagedWorldSection)。每當(dāng)攝像機(jī)移動(dòng)的時(shí)候,PageStrategy負(fù)責(zé)決定如何響應(yīng)一個(gè)在世界分頁(yè)區(qū)域(PagedWorldSection)中的頁(yè)面請(qǐng)求。它可能是一個(gè)網(wǎng)格系統(tǒng),這個(gè)時(shí)候它可能使用頁(yè)面之間的關(guān)聯(lián)性來(lái)確定遍歷的深度。無(wú)論如何,只要給定了一個(gè)世界統(tǒng)一坐標(biāo)、一個(gè)存在的分頁(yè)或一個(gè)分頁(yè)入口點(diǎn)(PageEntry point),這個(gè)策略就必須能夠決定哪些分頁(yè)必須被請(qǐng)求、哪些分頁(yè)必須被拋棄。分頁(yè)策略(PageStrategy)被設(shè)計(jì)成具備用戶(hù)可擴(kuò)展性。
Page(頁(yè)面)
這個(gè)類(lèi)聚合了一個(gè)數(shù)據(jù)頁(yè)的所有表述。它雖然定義了頁(yè)面,但實(shí)際上不包含其自身的任何數(shù)據(jù)。相反,它只是包含了一個(gè)LOD levels的列表和一個(gè)LOD策略的引用。每個(gè)分頁(yè)在世界區(qū)域里都有一個(gè)唯一的ID。
PageLOD(頁(yè)面層級(jí))
這個(gè)是為了在需要的情況下讓頁(yè)面內(nèi)容不止一次加載完。例如,您可能想要一個(gè)分多個(gè)階段加載的分頁(yè),其中包括最基本的內(nèi)容與一個(gè)距離相關(guān)的非常簡(jiǎn)單的定義,然后是包括靠近的時(shí)候更多細(xì)節(jié)的定義。我打算重用可插拔的LodStrategy類(lèi)來(lái)表現(xiàn)這些轉(zhuǎn)換規(guī)則(transition rules)。
現(xiàn)在定義我們頁(yè)面加載中所需單位化的特殊標(biāo)記:“世界ID:世界區(qū)域ID:分頁(yè)ID:分頁(yè)層級(jí)索引 (WorldID:WorldSectionID:PAGEID:PageLODIndex)”。我可能會(huì)在一個(gè)適當(dāng)?shù)牡胤椒胖靡粋€(gè)可插拔的轉(zhuǎn)換系統(tǒng),這樣就可以運(yùn)用這些數(shù)字,并將其轉(zhuǎn)換成一個(gè)獨(dú)特的資源來(lái)加載---這個(gè)資源可能簡(jiǎn)單到是一個(gè)文件(“myworld_sec1_p1234_0.dat”),或者可以轉(zhuǎn)換成一個(gè)現(xiàn)成的已打包好的資源文件或類(lèi)似東西中的一個(gè)偏移量。
PageContent(頁(yè)面內(nèi)容)
雖然PageLOD是加載的單位量,但是你可能還想要包含多種不同類(lèi)型的內(nèi)容。例如,在一個(gè)分頁(yè)中你可能有一塊地形、一些靜態(tài)幾何體、一些自定義的用戶(hù)數(shù)據(jù)(如觸發(fā)區(qū)域,世界中的物體等)。因此使用了PageLOD你就可以有多個(gè)PageContent實(shí)例,它們都被放在一起加載,但每一個(gè)實(shí)例都會(huì)有自定義數(shù)據(jù)格式和同樣的套路用于將其在線(xiàn)獲取。在加載時(shí),它們都將被工廠(chǎng)系統(tǒng)實(shí)例化,而這個(gè)工廠(chǎng)系統(tǒng)則基于名字加載器來(lái)實(shí)現(xiàn)的。
這些不同類(lèi)型的頁(yè)面內(nèi)容(PageContent)中的每一種也都可以自由地做他們自己的LOD版本的事情。例如,如果某個(gè)內(nèi)容包括了創(chuàng)建一些實(shí)體的實(shí)例并且它們是使用了LOD的網(wǎng)格,那么這個(gè)情況下將仍然提出申請(qǐng)。對(duì)于地形,每個(gè)分頁(yè)都有它自己的細(xì)分(subdivisions)與LOD,但其前提是這是一個(gè)基于內(nèi)存的LOD,適合于輕量級(jí)的動(dòng)態(tài)調(diào)整,而更高級(jí)別的PageLOD則更重量級(jí)并在實(shí)際上改變頁(yè)面內(nèi)容、造成內(nèi)存占用(memory footprint)的變化等(也同樣被潛在的執(zhí)行了)。這就是為什么存在兩種類(lèi)型的LOD的原因,它們并非互相重復(fù)。頁(yè)面內(nèi)容(PageContent)和頁(yè)面內(nèi)容工廠(chǎng)(PageContentFactory)都被設(shè)計(jì)成具備用戶(hù)可擴(kuò)展性。
Phew(瑪雅)
瑪雅,好吧,這是我有生以來(lái)寫(xiě)出的內(nèi)容最多的帖子之一。我希望一切看起來(lái)都很好---不過(guò)它仍然不夠精煉,因此沒(méi)有任何內(nèi)容是一成不變的,但我已經(jīng)花了相當(dāng)多的時(shí)間來(lái)思考整體架構(gòu)、我要支持什么樣的功能以及擴(kuò)展點(diǎn)在哪里,所以我很高興為公主澤做了這么多。歡迎評(píng)論!
Steve Streeting
Tue Mar 03, 2009 7:39 pm
[1] 一個(gè)著名的策略分析案例,指烏鴉飛行路線(xiàn)有一定隨機(jī)性,可能很遠(yuǎn),可能很近.
[2] with the same modes as available for resources