高云鵬 黃海明
摘要:游戲開(kāi)發(fā)過(guò)程中涉及很多關(guān)鍵技術(shù),好的技術(shù)應(yīng)用可以為復(fù)雜功能和卓越性能提供保障。該文以一款具體的捕魚(yú)游戲設(shè)計(jì)為例,分析了游戲中的各種功能實(shí)現(xiàn)及優(yōu)化技術(shù),包括資源優(yōu)化技術(shù)、壓縮加密技術(shù)、碰撞檢測(cè)技術(shù)、繪制優(yōu)化策略、粒子系統(tǒng)、基于自由路徑的魚(yú)群算法、基于編輯器的路徑生成技術(shù)等。通過(guò)運(yùn)用這些技術(shù),得到了較好的游戲結(jié)果。
關(guān)鍵詞: 2D引擎; 資源優(yōu)化; 路徑編輯; 碰撞檢測(cè); 粒子系統(tǒng)
中圖分類(lèi)號(hào):TP391 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)25-5877-06
The Research on Fishing Game Development and Optimization Technology
GAO Yun-peng1,HUANG Hai-ming2,3
(1.School of Computer Science and Technology , University of Science and Technology of China (USTC), Hefei 230026, China; 2. Institute of Automation, Chinese Academy of Sciences, Beijing 100080,China;3. China Lottery Online Co., LTD., Beijing 100011, China)
Abstract: Game development involves lots of key technologies, appropriate use of technologies can support realization of complex functions and perfect performance. This paper takes the design of fishing game for instance, analyzes the methods for realizing functions and technology for optimization including resource optimization, compress and encryption, collision detect, render optimization, particle system, fish group algorithm based on free path, path generation based on editor etc. Through the use of the above technologies, the game result is good.
Key words:2D engine; resource optimization; path editor; collision detect; particle system
近幾年,捕魚(yú)達(dá)人游戲的面世,引發(fā)了全民捕魚(yú)的狂潮。人們?yōu)槠渲行路f的玩法設(shè)計(jì),豐富而流暢的界面表現(xiàn),極強(qiáng)的趣味性而深深吸引。目前捕魚(yú)類(lèi)游戲已經(jīng)從手機(jī)游戲擴(kuò)展到了網(wǎng)頁(yè)游戲,街機(jī)游戲甚至端游領(lǐng)域。該文將以街機(jī)版捕魚(yú)游戲開(kāi)發(fā)為例,圍繞系統(tǒng)架構(gòu),軟硬件及算法等各方面進(jìn)行闡述。
1 游戲整體設(shè)計(jì)
在游戲系統(tǒng)設(shè)計(jì)中,首先要進(jìn)行架構(gòu)設(shè)計(jì),以滿足功能、保密性、高效性為目標(biāo),同時(shí)兼顧成本因數(shù)[1-3]。
在基礎(chǔ)硬件上,考慮成本,選擇了業(yè)內(nèi)流行的微特邁工業(yè)主機(jī)。在這種主機(jī)上可以安裝各種操作系統(tǒng)包括xp、winCE、Linux等等,所以不會(huì)對(duì)后續(xù)的技術(shù)選型造成太大的影響。
在游戲正式開(kāi)發(fā)前,游戲引擎的選擇至關(guān)重要[4]。由于這里要開(kāi)發(fā)的是2D游戲,所以可以在如下這幾種2D引擎中選擇,例如HGE、SDL、COCOS2D等等??紤]到開(kāi)發(fā)團(tuán)隊(duì)的知識(shí)結(jié)構(gòu),并考慮到在Windows下開(kāi)發(fā)調(diào)試比較便利,且winxp精簡(jiǎn)版消耗的內(nèi)存較小,也適合于在工業(yè)主機(jī)上安裝運(yùn)行,所以最終我們選擇了適合于windows操作系統(tǒng)的HGE引擎。在VS2008 IDE中進(jìn)行編程調(diào)試,最終在發(fā)布成xp版本。
由于要支持游戲?qū)S面I板輸入,包括按鍵、搖桿、投幣器等等,所以需要設(shè)計(jì)一塊IO控制板,將所有的輸入信號(hào)進(jìn)行收集,最終形成約定格式的報(bào)文,通過(guò)串口上傳給上位機(jī)。
由于要進(jìn)行圖片資源保護(hù),本游戲系統(tǒng)還需要設(shè)計(jì)一塊加密板,用來(lái)存放游戲用到的圖片資源。加密板上的資源數(shù)據(jù)塊可以通過(guò)特定的指令從加密板讀出到主機(jī)內(nèi)存中,并通過(guò)加解密,完成資源的應(yīng)用。
最終,本游戲系統(tǒng)設(shè)計(jì)了高效的資源管理模塊、靈活的魚(yú)動(dòng)畫(huà)系統(tǒng)模塊、高效簡(jiǎn)約的碰撞檢測(cè)模塊、特效模塊并采取手段提升了游戲系統(tǒng)的可靠性。
2 功能設(shè)計(jì)與優(yōu)化
2.1 圖片資源設(shè)計(jì)與優(yōu)化
在游戲中會(huì)用到很多資源圖片,圖片越多,加載越慢,且磁盤(pán)及內(nèi)存占用的代價(jià)越高。合理的技術(shù)應(yīng)用以及合理的資源劃分可以在滿足游戲邏輯需求的同時(shí),大大降低圖片資源量,從而達(dá)到節(jié)約磁盤(pán)及內(nèi)存空間,并縮短加載時(shí)間的目的。
2.1.1 使用合理的游戲邏輯技巧減少資源量
氣球魚(yú)是游戲中的一個(gè)特殊魚(yú)種,這種魚(yú)在被炮彈擊中一下就會(huì)膨脹一下,不斷擊中就會(huì)不斷膨脹變大(直到達(dá)到膨脹上限)。這里有一種通用做法是,根據(jù)該魚(yú)的不同大小由美術(shù)制作對(duì)應(yīng)大小的圖,全部放入游戲資源中,程序在不同的時(shí)候調(diào)用對(duì)應(yīng)大小的圖片來(lái)生成精靈對(duì)象并進(jìn)行繪制。顯然,這種方法可以生成很精美的氣球魚(yú)對(duì)象,但是資源量很大。為此本游戲采用了一種優(yōu)化方法,就是對(duì)于氣球魚(yú),美術(shù)只需要制作出一張圖,由程序根據(jù)邏輯情況來(lái)決定要給這個(gè)對(duì)象縮放多少倍,這樣就大大降低了資源量。但是其弊端在于由于要進(jìn)行運(yùn)行時(shí)縮放,需要額外的計(jì)算量,而且由于要進(jìn)行縮放,會(huì)導(dǎo)致最終的游戲?qū)ο罂雌饋?lái)不如通用做法那么精美。為此,本游戲系統(tǒng)根據(jù)大家的可接受情況,加入了一些中間級(jí)別大小的圖片,在運(yùn)行時(shí)根據(jù)需要縮放的倍率來(lái)選擇與之最接近的那個(gè)大小級(jí)別的圖片,并在此基礎(chǔ)上進(jìn)行縮放,從而提升了精度。最終這種方法在運(yùn)行效率、顯示精度和資源量之間做了較好的平衡。同樣的策略還被應(yīng)用于食人魚(yú)等體積可變的對(duì)象上。
2.1.2 使用實(shí)時(shí)特效粒子系統(tǒng)降低資源量
海底氣泡被大量應(yīng)用于海底場(chǎng)景的不同位置。如果采用圖片序列的方法來(lái)實(shí)現(xiàn),則需要做很多套序列圖(顯然做一套是不合適的,因?yàn)檫@樣會(huì)使得每個(gè)氣泡點(diǎn)效果都雷同),會(huì)占用大量空間。因此,在實(shí)際對(duì)于海底氣泡的實(shí)現(xiàn)中,我們采用了粒子系統(tǒng)。通過(guò)預(yù)先在粒子編輯器中編輯好對(duì)應(yīng)的氣泡粒子效果,保存成為粒子特效文件;然后在程序中利用粒子系統(tǒng)引擎API進(jìn)行調(diào)用,在游戲初始化時(shí)載入這些特效文件,然后在游戲運(yùn)行過(guò)程中在指定位置激發(fā),就實(shí)現(xiàn)了海底冒氣泡的效果。這種方法所形成的資源量極低,且每次播放的效果都不同,沒(méi)有雷同感。同樣,在很多其他的場(chǎng)合例如全屏炸彈爆炸等等,都采用這種粒子系統(tǒng)技術(shù)來(lái)實(shí)現(xiàn),大大降低游戲資源量,同時(shí)也減小了因大圖片而導(dǎo)致的渲染壓力。
2.1.3 對(duì)游戲?qū)ο筮M(jìn)行合理劃分降低資源量
游戲中的魚(yú)的姿態(tài)動(dòng)作是通過(guò)制作序列幀圖片來(lái)實(shí)現(xiàn)的。對(duì)于魚(yú)A的普通游動(dòng),需要序列幀圖1a;對(duì)于魚(yú)B的普通游動(dòng),需要序列幀圖1b。
圓盤(pán)魚(yú)是那些帶自旋轉(zhuǎn)圓盤(pán)底座的魚(yú)的總稱,是游戲中的一種表現(xiàn)。圓盤(pán)魚(yú)與普通魚(yú)一樣,也是通過(guò)制作其序列幀圖片來(lái)滿足游戲?qū)ο髣?dòng)畫(huà)的需要。
圓盤(pán)魚(yú)A、圓盤(pán)魚(yú)B游動(dòng)動(dòng)畫(huà)所需要的序列幀圖片如圖2:
因此如果有N種魚(yú)及其對(duì)應(yīng)的圓盤(pán)魚(yú),則需要2N套序列幀圖片。顯然魚(yú)A與圓盤(pán)魚(yú)A這兩套游動(dòng)序列幀圖有很多相同之處,基于此,我們對(duì)圓盤(pán)魚(yú)A進(jìn)行了如下分解:魚(yú)A游動(dòng)+圓盤(pán)底座自轉(zhuǎn),分解示意圖如圖3。其中魚(yú)A游動(dòng)就用序列幀圖1a,圓盤(pán)底座自轉(zhuǎn)就只需要一張圓盤(pán)底座圖,然后由程序來(lái)控制其自轉(zhuǎn)。在游戲中通過(guò)數(shù)據(jù)結(jié)構(gòu)將兩者的位置綁定在一起,最終實(shí)現(xiàn)了圓盤(pán)魚(yú)。最終的表現(xiàn)與原始方案一致,但是其資源量變成了N套序列幀圖片+1張靜態(tài)圖片,內(nèi)存占用小了很多。
2.2 魚(yú)動(dòng)畫(huà)系統(tǒng)的設(shè)計(jì)與優(yōu)化
游戲中需要各種各樣的魚(yú)在場(chǎng)景中游動(dòng),魚(yú)動(dòng)畫(huà)系統(tǒng)分為魚(yú)的自身姿態(tài)動(dòng)作和魚(yú)的運(yùn)動(dòng)路徑控制兩部分。
2.2.1 自身姿態(tài)動(dòng)作
本游戲中魚(yú)的姿態(tài)動(dòng)畫(huà)都是基于序列幀圖來(lái)實(shí)現(xiàn)的,正如上一節(jié)圖1a、1b所示。通過(guò)美術(shù)制作出游動(dòng)、被擊斃、擊中反應(yīng)等序列幀圖來(lái)實(shí)現(xiàn)其游動(dòng)動(dòng)作、擊斃動(dòng)作和擊中反應(yīng)動(dòng)作等,最終通過(guò)hge序列幀動(dòng)畫(huà)對(duì)象的更新來(lái)實(shí)現(xiàn)。
2.2.2 運(yùn)動(dòng)路徑控制
魚(yú)的運(yùn)動(dòng)路徑控制所需的游動(dòng)路徑可以由程序?qū)崟r(shí)生成。也就是說(shuō)通過(guò)算法計(jì)算魚(yú)在下一時(shí)刻的位置和朝向就可以使魚(yú)一直游下去。但是顯然這種方法無(wú)法生成比較漂亮的路徑,且實(shí)時(shí)計(jì)算會(huì)消耗較多的CPU資源,并很難保證魚(yú)的運(yùn)動(dòng)區(qū)域的均衡性。因此,本游戲系統(tǒng)采用了一種基于“路徑編輯器+路徑讀取綁定”的魚(yú)運(yùn)動(dòng)策略。首先人工編輯生成多條路徑信息存放在文件中(簡(jiǎn)稱路徑文件),然后再將某一條路徑綁定到魚(yú)上,這樣魚(yú)就可以按照路徑文件中的信息來(lái)進(jìn)行位置更新達(dá)到運(yùn)動(dòng)目的。這種方法的好處在于可以由美術(shù)人員來(lái)進(jìn)行路徑設(shè)計(jì),生成比較漂亮的路徑,且可以使所有的路徑在整個(gè)場(chǎng)景空間中分布比較均衡。其弊端在于需要生成路徑文件,從而占用一定磁盤(pán)及內(nèi)存空間。
路徑文件是文本文件,其形式可以設(shè)計(jì)成很多種,最直接的方法是將各幀的路徑點(diǎn)的位置和朝向都記錄下來(lái),保存在文件中,但是這樣會(huì)導(dǎo)致路徑文件過(guò)于龐大,空間消耗代價(jià)太大。為此,本游戲系統(tǒng)設(shè)計(jì)并實(shí)現(xiàn)了一種基于貝塞爾曲線(Bezier)的路徑生成方法:通過(guò)預(yù)先設(shè)定Bezier曲線控制點(diǎn),通過(guò)插值公式可以生成路徑上的所有路徑點(diǎn)的位置和朝向。從而使得在路徑文件中,只需要記錄各路徑的曲線控制點(diǎn),在加載時(shí)再插值生成其他的路徑點(diǎn),在實(shí)際運(yùn)行時(shí)根據(jù)當(dāng)前時(shí)刻取出對(duì)應(yīng)的路徑點(diǎn)位置和朝向。這樣使得最終路徑文件很小,只需要極低的磁盤(pán)內(nèi)存空間。最終我們?cè)O(shè)計(jì)的路徑文件如下(這是其中的一條路徑的描述):
1) 在預(yù)處理階段,進(jìn)行特效編輯,保存成特效文件;
2) 游戲初始化時(shí)載入特效文件生成特效對(duì)象;
3) 在游戲邏輯過(guò)程中需要的時(shí)候,在指定的地點(diǎn)激發(fā)特效對(duì)象。
2.5 其他優(yōu)化技巧
在游戲繪制過(guò)程中,對(duì)那些真實(shí)屏幕之外的魚(yú)的繪制毫無(wú)意義,而且會(huì)增加顯卡負(fù)擔(dān),因此在遍歷魚(yú)隊(duì)列進(jìn)行繪制前,需要先判斷魚(yú)的狀態(tài),只有那些在屏幕內(nèi)可見(jiàn)的魚(yú)才真正調(diào)用繪制函數(shù)。這樣提高了本游戲的渲染效率。
另外,游戲中采用了多線程來(lái)進(jìn)行優(yōu)化。例如在場(chǎng)景切換瞬間因?yàn)橐虞d大量圖片數(shù)據(jù)而會(huì)導(dǎo)致CPU負(fù)載太大,出現(xiàn)1秒左右的卡頓,我們將待切換場(chǎng)景圖片、海浪圖片的加載提前到場(chǎng)景切換的時(shí)間點(diǎn)之前,并用專門(mén)的線程來(lái)完成,避免了卡頓現(xiàn)象。另外在多人同時(shí)發(fā)炮時(shí),需要同時(shí)播放多個(gè)發(fā)炮音效,如果都放在主進(jìn)程中,會(huì)導(dǎo)致主邏輯循環(huán)在發(fā)炮瞬間降到10fps以下。為此,最終游戲中是將聲音的播放都放在一個(gè)播放線程中,解決了由于聲音播放負(fù)荷過(guò)大而導(dǎo)致的游戲畫(huà)面表現(xiàn)卡頓現(xiàn)象。
3 結(jié)束語(yǔ)
最終,我們按照上述開(kāi)發(fā)方法和技巧完成了整個(gè)游戲系統(tǒng)的開(kāi)發(fā),并發(fā)布在工業(yè)主機(jī)上運(yùn)行,如下是游戲截圖(圖8) 。在將屏幕上的空炮彈數(shù)限定在100發(fā)以內(nèi)的情況下,當(dāng)屏幕上魚(yú)數(shù)達(dá)到80,且在屏幕上同時(shí)播放8個(gè)粒子特效的情況下,幀率也可以達(dá)到60fps以上,畫(huà)面流暢,整體效果良好。
參考文獻(xiàn):
[1] 趙大偉,肖周芳,張艷.淺談2D游戲的一些技術(shù)方法[J].科技信息,2008(30):81-82.
[2] 高凌琴,陳青華.俄羅斯方塊游戲關(guān)鍵技術(shù)探討[J].信息技術(shù)與信息化,2008(2):69-71.
[3] 鄭勇,劉乃琦.BREW手機(jī)賽車(chē)游戲若干技術(shù)難點(diǎn)及實(shí)現(xiàn)[J].成都信息工程學(xué)院學(xué)報(bào),2006(2).
[4] 黃藍(lán)梟.游戲引擎中特效的實(shí)時(shí)渲染技術(shù)研究[D].成都:電子科技大學(xué),2008.
[5] 李博.游戲人工智能關(guān)鍵技術(shù)的研究[D].上海:上海交通大學(xué),2011.
[6] Van den Bergen G.Efficient collision detection of complex deformable models using AABB trees[J].Journal of Graphic Tools,1997,2(4):1-13.
[7] 王志強(qiáng),洪嘉振,楊輝.碰撞檢測(cè)問(wèn)題研究綜述[J].軟件學(xué)報(bào),1999,10(5):545-551.
[8] 張帆,潘瑞芳,葉福軍,等.視頻游戲中碰撞檢測(cè)算法的選擇[J].電腦知識(shí)與技術(shù),2011,7(13):3136-3137.
[9] 陳學(xué)文,丑武勝,劉靜華,等.基于包圍盒的碰撞檢測(cè)算法研究[J].計(jì)算機(jī)工程與應(yīng)用,2005,41(5):46-50.