首先要說明的是資源格式。資源格式一般存放如下格式資源|
--- part0
|----part1
|----part2
|...
乙個很好的例子就是模型資訊檔案,在乙個模型資訊檔案中,存放了整個物體的所有部分,每乙個部分又是單獨的資訊。這樣做的目的在於遊戲中的換裝。
還有乙個例子就是特效檔案,比如將乙個門派的技能做為乙個特效檔案,而這個特效檔案中包含了所有技能的技能特效。又或者說,當我們要實現不同等級的技能有不同特效的時候,就可以將乙個技能做乙個特效檔案,而特效檔案中存放的則是不同的等級的特效。
接下來就是要說明邏輯和渲染部分的劃分。有些遊戲是直接將渲染和邏輯嵌在一起的。這樣做我覺得非常不好,不便於後期擴充。加上渲染部分的東西在邏輯裡亂飛,也會干擾清析度。並且,你不能假設所有寫邏輯的同伴都喜歡和圖形沾親帶故的。因為有必要將渲染部分和邏輯劃分開來。
一種常見的分法就是將渲染部分交給場景管理器,而由場景管理器引出乙個場景物件。好比
ogre
中的entity
這個entity
是掛接在場景切點上的。
在這個entity
中,就包含了我們需要顯示和繪製的東西,如模型,特效,位置,材質等等東西。邏輯在使用的時候,只需讓邏輯物件派生(
class
匯出方式),或者嵌入(匯出介面方式)這個場景物件,即可實現資訊的共享。我採用的是介面匯出方式。
class isceneobject;
class cgameobject
;劃分情況就是如此了。那我們如何與場景物件介面通訊呢。場景物件介面需要提供一些什麼操作呢?
那些改變基礎屬性的,
如位置,方向,大小,移動,控制動畫等都是很直觀的。
那我們如何改變乙個場景物件的渲染資訊?
改變這些渲染資訊的時候,又應該以什麼樣的方式來進行?
在此我們想到,邏輯中,乙個物件都有他自身的各種屬性,如果這個物件需要被渲染,肯定也需要一些渲染資訊,如採用什麼哪些模型的
part
,模型上有哪些特效等。
直接的方案就是按照上面講的資源劃分方式提供如下資訊表。
struct srenderinfo;那麼
,當我們想要為場景中的乙個人物增加一件裝備的時候,我們就可以像這樣提供乙個介面。
isceneobject::addpart(const
tchar* modelinfofile,const tchar* partname)=0;
而假設現在我有乙個「肩膀」,肩膀是「天尊套裝」中的「肩膀」。那麼這個裝備的
srenderinfo mrenderinfo
結構的值是
我們呼叫
msceneobject->addpart(mrenderinfo->szresfile,mrenderinfo->szresname);
便可以修改乙個模型的肩膀,外部並不用關心這個模型的任何渲染過程。
那我們要增加乙個特效呢?
要知道,特效是隨時都在呼叫的,當你釋放乙個技能的時候,特效被增加,當你技能放完了,特效又會被刪除。
(有個例外的情況就是光環類技能,這種技能的特效是會隨著技能的關閉才刪除的)。
總的來說,我們就需要
isceneobject::addeffect(const tchar* effectfile,const tchar* effectname)=0;
介面。那我們或許會想做些優化,比如當我穿戴同樣的裝備的時候,就可以不用再呼叫
addpart
了。嗯,或許你會說這種東西用不著優化,那好吧。那特效呢?
成十成百的人放特效的時候,如果他們都總是按著乙個技能不停的放。你覺得會不會有必要呢?
減少了特效的切換,減少了許多
api的呼叫,模型不用重新計算他的特效資訊,不需要重新掛接。
或許,可以用字串比較的方式來斷定。比如們可以在
addeffect
內部檢查是不是已經有相同的特效存在了,是不是在同一位置。。這樣我們就可以不用做更多的工作。當然,這樣是可以的。
而外部呢,你有資訊在字串亂飛的同時保證所有東西都正確嗎?
其實上面的解釋都不足以讓我搬出下面的東西,但是有時候它會讓程式寫著簡單。
想像一下,在配置檔案中,
我們總是會給資源乙個索引,然後才是他真正的內容。我們很少看到乙個東西用字串來索引的,當然,也有,我沒有說沒有。我們是不是可以試著將所有資訊存放起來,然後用乙個索引來索引它們呢?
比如現在有
50個玩家出現在你的周圍,而他們穿的裝備中有
50%是共同的,如果我們採用剛剛的方式,就會出現許多個
sizeof(tchar)*64*2.
並且,裝備模版,特效模版的資訊
如果沒有和他們放一起,會是多麼複雜的一件事。
但是,如果通過索引的話,僅僅是乙個
16位索引,就可以解決問題。其實我們一開始就可以這樣做,除了模型顯示資訊外,還有一些基礎資訊都是共同的,這就是我們經常提到的裝備模版。
當我們採用索引後,一切就變得簡單了。
用索引索引出這些資訊,再傳給場景物件,看起來多麼容易的一件事啊。
其實我現在不是這樣做的,我是在場景管理內部做了乙個資源資訊表,這個表不管其它的,只負責資源
id,資源檔案和資源部分的對應關係。
而場景管理是不會載入任何的資源資訊的。
因為我根本不知道乙個遊戲的資源配置檔案會寫成什麼樣,會用什麼寫(
xml?
ini,
excel
?)。於是,對外提供了乙個註冊這些資源資訊到內部的介面。而當我們上面的介面則變成了
isceneobject::addpart(int resid);
isceneobject::addeffect(int resid);
看到了嗎?
我並沒有用
modelid,
和effectid.
說明什麼呢,說明所有資源採用的是統一編號。
這樣做貌似不太好。但這樣在場景管理中就不再需要維護多種資源的資源表了。而上面這兩個函式的實現,則是根據資源索引取得資源資訊,然後就可以正式進行操作了。
或許,我們可以把這個對映交給寫邏輯的人處理,只是不知道他們願不願意。
之所以寫出來,是因為我在猶豫,到底哪種方案更好,或者有沒有更好的方案來解決這個事情。。。。
posted @
2010-07-12 11:49
麒麟子(alex) 閱讀(
...)
編輯收藏
遊戲中的資源管理 資源快取記憶體
1.什麼是資源快取記憶體 資源快取記憶體的原理與其它記憶體快取記憶體的工作原理是相似的。在遊戲的狀態轉換過程中,有些資料是剛才使用過的,那麼直接從資源快取記憶體中載入即可。例如,rpg 遊戲中主角從大地圖進入乙個房間,探索一番後主角退出房間,此時只要直接從快取中載入大地圖資料即可,節省了從硬碟載入資...
遊戲中的資源包
現在的遊戲中一般都有自己的資源包。早期看到很多2d遊戲都沒有資源包的,資源都是分散著的,當然可以直接看到其中每個檔案的內容。後來發現很多遊戲都有資源包了,像天下貳 劍網三等等。下面說說一些遊戲的資源包 1.天龍八部on line 天龍八部的資源在沒有加密前是很容易提取出來的。天龍八部是我最早知道使用...
遊戲中的資源管理器
我寫過乙個2d遊戲。寫2d遊戲時大部分的精力花在gui的撰寫和寫指令碼的介面上了。之前寫gui的時候,new乙個button的時候就load乙個texture,如果頻繁切換gui,texture就會頻繁地load和release。所以把紋理的載入管理與gui寫在一塊是很浪費效率的。最好的方法是紋理的...