關(guān)于無限LOD地形的構(gòu)想

前敘
----
從沒好好寫過一篇文章,現(xiàn)在也來好好寫寫
首先:具備了單個(gè)地形塊Lod四叉裁減的能力就可以考慮做無限大地圖和地形塊的動(dòng)態(tài)內(nèi)存管理能力了
但是首要條件是現(xiàn)搞定單個(gè)地形塊的四叉裁減,這個(gè)很基本也很是前提條件
無限地圖的實(shí)現(xiàn)構(gòu)想如下:
多個(gè)Tile的四叉剪裁
------------------
角色在移動(dòng)的過程中,自身包括周圍的一共9個(gè)Tile都是在可視范圍內(nèi)的,9個(gè)tile以外視錐看不到
視錐只和相交的Tile去做四叉剪裁,最多能看到四個(gè)Tile的內(nèi)容,再分別進(jìn)行可見Tile的剪裁
剪裁以后可見的Block送入到管線里面去渲染,四叉剪裁范圍比較固定最多四個(gè)257x257的Tile,
范圍很小,剪裁效率很高
正題部分 — 關(guān)于無限地圖的構(gòu)想
------------------------------
首先是客戶端
地圖可以是無限大的,把整個(gè)游戲的外景地圖叫做世界地圖吧
世界地圖不論有多大,都可以拆分成塊成一個(gè)個(gè)的Tile
Tile無縫拼接
------------
世界地圖只做一張大的高度圖,alpha混合紋理,光照?qǐng)D,并由美工去按tile的大小去分割這些圖
這樣分割出來的圖自然是無縫銜接的,每個(gè)Tile也有了自己配套的高度圖,混合紋理,光照了
而且整個(gè)世界源圖是一張,美工也很容易處理和修改,最大的好處是解決接縫問題和動(dòng)態(tài)加載問題
動(dòng)態(tài)內(nèi)存管理的基本思想:游戲的人物一般長(zhǎng)時(shí)間一般再某個(gè)局部區(qū)域內(nèi)活動(dòng),
游戲中只加載那些經(jīng)常訪問的Tile,不經(jīng)常訪問的Tile不加載
具體實(shí)現(xiàn) -隊(duì)列
---------------
把參加剪裁的地形放入到隊(duì)列中去,最新參加裁減的放到head,隊(duì)列中已存在的就直接排到head,
不存在就新建tile,然后排到head,過去剪裁的排后直到end出隊(duì)列并釋放
隊(duì)列放入最近訪問到的Tile首指針,長(zhǎng)度可根據(jù)需要去定義,不能過小,或過大
過大內(nèi)存好用太大,過小導(dǎo)致加載釋放頻繁,我想設(shè)置成36足夠了
有一種情況很特別:就是人物從地圖的一頭一直跑向另一頭,一定會(huì)不停的加載和釋放
這是無法避免的,所以,要對(duì)加載和剪裁進(jìn)行測(cè)試并優(yōu)化
需要保證間隔時(shí)間內(nèi)不斷創(chuàng)建和釋放的257的地形而"不卡"
也就是保證客戶端帶的起就行,一個(gè)257x257的Tile加載并裁減時(shí)間很短暫,其實(shí)問題不大
這個(gè)方法不一定很好,也可以采用dxsdk example contextStream技術(shù)(我還不會(huì),也只了解- -!)
或是動(dòng)態(tài)輔助GC線程的管理,有很多種策略,方法不是唯一的,只要適合自己就行。
服務(wù)器端無限地圖
------------------
目前只有個(gè)模糊的構(gòu)想:
因?yàn)檫€沒開始做服務(wù)器端的東西,我想客戶端搞定后,把IOCP的服務(wù)器加上來
我想登錄服務(wù)器應(yīng)該有用戶的Session,這個(gè)Session關(guān)聯(lián)與角色相關(guān)的一切信息,
包括所見的tile,并做游戲規(guī)則的檢測(cè),任務(wù)流程等等,
服務(wù)器端而不需要保存block的信息,只有所有的tile信息,和tile里面的場(chǎng)景包圍盒信息
不需要包含細(xì)致的東西,這樣不僅可以大大節(jié)約內(nèi)存,而且執(zhí)行效率也高,
服務(wù)器只做規(guī)則引擎,而不做渲染,還記得傳奇純外掛給我們留下了深刻的印象,只運(yùn)行外掛就可以練級(jí),
里面也有人物的地圖,而且移動(dòng)的地圖就好像是個(gè)衛(wèi)星定位圖一樣,根本沒有細(xì)節(jié)部分,人物就是一個(gè)點(diǎn)
我想服務(wù)器的地圖做成那樣一個(gè)2D的東西就足夠了,甚至需不需要做都無所謂,也就是網(wǎng)絡(luò)監(jiān)控友好點(diǎn)吧。
好了,就寫這么多了,有些部分也還只是個(gè)構(gòu)想未實(shí)現(xiàn),一定有很多不健全的地方,我現(xiàn)在要去一一實(shí)現(xiàn)。
在做的過程中一定能有更好的思路。
本人業(yè)余人士,只是水平有限, 單槍匹馬, 只是激情無限,有什么不對(duì)或更好的建議還望指正!