最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

BlockOS開發(fā)日志(三)設(shè)計(jì)資源管理系統(tǒng)

2023-03-30 11:23 作者:Zerous  | 我要投稿

為什么要設(shè)計(jì)資源管理系統(tǒng)?

從總體上概括的話,是因?yàn)閁nity引擎本身提供的資源管理系統(tǒng)過于簡(jiǎn)單,不能滿足項(xiàng)目的定制化需求。所以需要另外開發(fā)一個(gè)資源管理系統(tǒng)用于本項(xiàng)目。

具體到開發(fā)過程里來說,是因?yàn)槲以陂_發(fā)區(qū)塊及其渲染系統(tǒng)的過程中意識(shí)到,方塊的模型文件以及材質(zhì)貼圖都因?yàn)槠湫枰吓秩镜男枨笮枰鎏厥獾亩ㄖ啤R虼藳Q定先完成資源管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。

需要管理哪些資源?

由于我對(duì)BlockOS定下的第一個(gè)規(guī)劃首先就是完成區(qū)塊及其渲染系統(tǒng)的開發(fā),因此目前暫時(shí)只能明確區(qū)塊和區(qū)塊渲染系統(tǒng)所需求的資源。

首先在前面的開發(fā)日志中已經(jīng)提到過,由于方塊眾多,區(qū)塊需要使用合批的方式進(jìn)行渲染。我對(duì)此的實(shí)現(xiàn)思路參考了著名的Marching Cubes算法。Marching Cubes算法是將一個(gè)單元格的8個(gè)頂點(diǎn)的有無情況作為比特位寫入到一個(gè)字節(jié)中,根據(jù)這個(gè)字節(jié)去查詢網(wǎng)格表,確定最終該單元格的網(wǎng)格。而要做到能繪制出多種多樣方塊的網(wǎng)格,則需要做的事比Marching?Cubes算法更多一些:本方塊在上下左右前后六個(gè)方向的遮擋位標(biāo)志、方塊元數(shù)據(jù)(如擺放方向,特殊狀態(tài)等)、方塊紋理數(shù)據(jù)和方塊模型數(shù)據(jù)。

它們的數(shù)據(jù)結(jié)構(gòu)?

在Marching Cubes算法中,頂點(diǎn)位標(biāo)志和模型間的關(guān)系可以看作是以位標(biāo)志為自變量而單元格模型為因變量的函數(shù)關(guān)系:

Model%3Df(VertexFlags)

而BlockOS中,則是遮擋位標(biāo)志、元數(shù)據(jù)和紋理數(shù)據(jù)為自變量:

Model%3Df(OcclusionFlags%2CMetadata%2CTexture)

那么方塊模型本質(zhì)上就可以看作是一個(gè)函數(shù)。遮擋位標(biāo)志由實(shí)時(shí)計(jì)算得出,元數(shù)據(jù)通過讀取區(qū)塊數(shù)據(jù)得到,而紋理數(shù)據(jù)則通過查詢紋理管理器得到。

由上面的分析可以得出,方塊模型還依賴一個(gè)紋理管理器。因此還需要對(duì)紋理管理器進(jìn)行設(shè)計(jì)。

結(jié)合前面開發(fā)日志的方案可以得到,由于合批渲染的需要,紋理被讀取后,將在內(nèi)存中被合并為一張大紋理。而小紋理將會(huì)被存儲(chǔ)為一個(gè)在大紋理的相對(duì)位置的“引用”。和2D游戲開發(fā)中精靈(Sprite)的概念很像。那么后面就叫它方塊精靈吧。

紋理管理器會(huì)讀取紋理包中指定文件夾中的所有方塊精靈文件。讀取完成后,以文件名為鍵,相對(duì)位置為值生成鍵值對(duì)以便方塊模型查詢。

參考鏈接器,這個(gè)過程可以繼續(xù)優(yōu)化。方塊模型可以不必存儲(chǔ)對(duì)應(yīng)模型的名字,而是直接持有其相對(duì)位置,這樣就可以在渲染過程中減少計(jì)算字符串哈希的時(shí)間。

資源加載流水線

根據(jù)上面的分析以及對(duì)渲染API的參考,我認(rèn)為可以提出一個(gè)資源加載流水線的概念。

這段可以用函數(shù)式的思路來看,方塊模型是一個(gè)函數(shù),而區(qū)塊資源加載流水線則是可以生產(chǎn)這個(gè)方塊模型函數(shù)的高階函數(shù)。紋理名稱-相對(duì)位置哈希表則是中途生成的臨時(shí)數(shù)據(jù)。

區(qū)塊資源加載流水線再往細(xì)了說,按照?qǐng)D片所示,可以有方塊模型定義、方塊紋理精靈、大紋理和方塊模型幾個(gè)組成部分。其中最終存儲(chǔ)在內(nèi)存中的,只有大紋理和方塊模型。方塊模型定義也是一個(gè)高階函數(shù),輸入紋理精靈,輸出方塊模型函數(shù)。方塊紋理精靈則將最終作為方塊模型中的一個(gè)字段存儲(chǔ)于方塊模型中。

區(qū)塊資源加載流水線

資源存儲(chǔ)

探討完了資源加載,還有一個(gè)話題是如何查詢到目標(biāo)資源。大紋理全局唯一,可以直接硬編碼來獲取。而方塊模型數(shù)據(jù)則需要以方塊id來查詢,因此需要用哈希表來存儲(chǔ)。這里也可以進(jìn)行優(yōu)化來避免反復(fù)計(jì)算方塊id的哈希值。這個(gè)留到后面的區(qū)塊建造流水線中再討論吧。

最后解釋下這么久沒更新的原因:作為一個(gè)學(xué)習(xí)不努力的懶狗,終于還是在春招的尾巴上找到了一家可以轉(zhuǎn)正的Unity3D實(shí)習(xí)崗,這半個(gè)月都在適應(yīng)新的生活節(jié)奏= =。所以一直很少能騰出時(shí)間來做開發(fā)日志,現(xiàn)在終于開始有些適應(yīng)了,可喜可賀。這半個(gè)月以來的很多點(diǎn)子想出來都沒能好好記錄一下挺可惜的,那么現(xiàn)在就立刻開始記錄吧。

BlockOS開發(fā)日志(三)設(shè)計(jì)資源管理系統(tǒng)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
丰城市| 金秀| 和平县| 简阳市| 宜川县| 巴楚县| 东明县| 天台县| 虎林市| 尼勒克县| 当雄县| 偃师市| 张家港市| 安西县| 清丰县| 东乌珠穆沁旗| 裕民县| 东源县| 石狮市| 伊吾县| 儋州市| 抚顺县| 贡觉县| 屏南县| 久治县| 宣城市| 施秉县| 黑龙江省| 德格县| 密云县| 武穴市| 资讯 | 胶州市| 高尔夫| 增城市| 万荣县| 邵阳市| 神木县| 峨边| 阿城市| 河间市|