|
Tile Based Engine的設(shè)計(jì) - 精靈鏈表
通常說(shuō)來(lái), 第三人稱(chēng) 2D 游戲中通常把景物和精靈分開(kāi)處理 (至少我是這樣的) 尤其是游戲機(jī)上, 硬件對(duì)精靈有支持. 現(xiàn)在我們的顯卡多也支持顯存間的 keycolor 檢查 Blt 操作, 實(shí)際就是用來(lái)加快精靈處理的 (也包括景物)
精靈在運(yùn)動(dòng)時(shí), 往往是基于像素的 (雖然有人喜歡簡(jiǎn)化設(shè)計(jì), 精靈在停止的時(shí)候仍舊是站在格子里) 而景物卻是靜止在格子中.
如果能使用更有針對(duì)性的方法分別繪制, 將可以提高游戲的速度. 本文的觀(guān)點(diǎn)源于云風(fēng)早前所寫(xiě)的斜視角圖形引擎的設(shè)計(jì)系列.
并在近期實(shí)踐(制作一商業(yè)A.RPG游戲)中得到完善.
實(shí)際上, 游戲中每幀圖象, 沒(méi)有必要每次用各個(gè)圖素合成,
尤其在使用了大量如Alpha輪廓, 透明等大運(yùn)算操作的情況下, 屏幕上并未更改的區(qū)域重復(fù)被運(yùn)算非常的浪費(fèi)時(shí)間. 所以我們可以借鑒游戲機(jī)的做法,
場(chǎng)景圖面創(chuàng)建的稍稍比屏幕大一圈, 只在屏幕移出窗口時(shí)再補(bǔ)繪場(chǎng)景, 把精靈提出, 每幀重繪于場(chǎng)景上.
合成精靈與場(chǎng)景有三大問(wèn)
題, 一是如何處理精靈的遮擋問(wèn)題, Isometric Tile Engine 的遮擋處理一文闡述了云風(fēng)的觀(guān)點(diǎn); 其二是如何清除上一幀的精靈:
(當(dāng)然這一步也可以省略, 改為將場(chǎng)景層和精靈層合成到第三緩沖區(qū)) 如果不想多建立一屏幕后臺(tái)緩沖區(qū), 減少合成圖層時(shí)的數(shù)據(jù)移動(dòng)量,
我們可以采取在繪制精靈前保存精靈原處的場(chǎng)景圖象. 具體實(shí)施方案在后面將有詳細(xì)解說(shuō)。
最后一大要點(diǎn)是以正確的次序繪制精靈了. 這里我想使用一個(gè)鏈表, 串起場(chǎng)景中的所有精靈, 姑且將它稱(chēng)為精靈鏈表吧. 同時(shí)我們還需要另一個(gè)鏈表保存屏幕上可見(jiàn)的精靈, 減少我們處理精靈的數(shù)量.
場(chǎng)景精靈鏈表是創(chuàng)建場(chǎng)景時(shí)創(chuàng)建的, 在某精靈消失(死亡)后從鏈表中刪除, 精靈也可以在游戲時(shí)被創(chuàng)建加入鏈表.
而屏幕精靈鏈表卻是繪制屏幕時(shí)動(dòng)態(tài)生成, 保證其中精靈滿(mǎn)足從后到前的順序. 這樣我們只需要在產(chǎn)生鏈表后, 依鏈表次序?qū)⒕`繪制到屏幕就可以了
:-)
那么整個(gè)處理過(guò)程如下:
根據(jù)當(dāng)前的屏幕精靈鏈表清除上幀圖象中所有的精靈 清除當(dāng)前屏幕精靈鏈表 遍歷整個(gè)場(chǎng)景精靈鏈表, 處理每個(gè)精靈的動(dòng)作和狀態(tài), 如果精靈正在屏幕上, 就將其按前后次序插入屏幕精靈鏈表. 將即將繪制的精靈位置的場(chǎng)景保存 按屏幕精靈鏈表次序繪制精靈到屏幕 顯示一幀圖象 循環(huán)這些步驟
第一步清除上幀精靈的具體操作中, 我們可以為每一個(gè)精靈分配一個(gè)緩存圖, 保存繪制前的場(chǎng)景. 但這樣比較浪費(fèi).
因?yàn)椴辉谄聊簧系木`根本用不著這個(gè)緩存圖. 所以我們可以進(jìn)一步優(yōu)化為, 精靈進(jìn)入屏幕時(shí)才分配緩存圖, 移出屏幕就釋放掉.
不過(guò)內(nèi)存分配實(shí)際是一個(gè)很消耗時(shí)間的過(guò)程. 當(dāng)精靈大小都類(lèi)似時(shí),進(jìn)一步的優(yōu)化方案是限定屏幕上可以同時(shí)出現(xiàn)的精靈的數(shù)量,
初始化時(shí)就統(tǒng)一分配一批等大的緩存圖(我稱(chēng)其為緩存池), 其每一個(gè)都足已容納最大的精靈. 當(dāng)某個(gè)屏幕精靈需要緩存圖時(shí),
就從緩存池中找一個(gè)沒(méi)有使用的供其使用, 精靈移出屏幕后, 放棄對(duì)緩存圖的控制即可.
關(guān)于第3步將存在于屏幕的精靈插入屏幕精靈鏈表的操作, 涉及如何判定精靈的前后關(guān)系. 我們可以在作圖時(shí), 就將精靈的重心定為其參考點(diǎn)保存中圖素的文件中. 利用這個(gè)參考點(diǎn)的坐標(biāo)就可以完成精靈的前后判定了 ;-)
本文總結(jié)了云風(fēng)近期制作游戲中的些經(jīng)驗(yàn), 希望對(duì)后來(lái)者有所借鑒. 成文倉(cāng)促, 錯(cuò)誤在所難免. 提及方法也是我的個(gè)人觀(guān)點(diǎn), 游戲設(shè)計(jì)的魅力在于其設(shè)計(jì)時(shí)可以不遵循常例,任意發(fā)揮, 在此歡迎大家一起探討, 指出錯(cuò)誤和不足.
|