郝 運(yùn), 郭向坤
1(中國(guó)科學(xué)院大學(xué),北京 100049)
2(中國(guó)科學(xué)院 沈陽(yáng)計(jì)算技術(shù)研究所,沈陽(yáng) 110168)
由于游戲、仿真等系統(tǒng)的復(fù)雜性,在實(shí)際的開發(fā)過程中需要對(duì)系統(tǒng)進(jìn)行清晰合理的劃分層次[1]. 其中,由于輸入硬件的差異性,可能存在多相與并行的控制命令. 現(xiàn)有的游戲引擎,例如Unity,可以方便的添加與刪除多個(gè)控制器,但是往往無(wú)法從控制信號(hào)的底層來(lái)有針對(duì)性的進(jìn)行管理[2]. 我們拓展并改進(jìn)了目前相對(duì)流行的開源游戲引擎cocos2d-x[3],實(shí)現(xiàn)了以交互為核心的控制器,明確了實(shí)際的原型系統(tǒng)中控制層所處的層次以及和其它層的關(guān)系. 提出一種實(shí)現(xiàn)方法,該方法具有硬件無(wú)關(guān)性,保證了指令系統(tǒng)的可擴(kuò)展性且易于維護(hù),并能在語(yǔ)言層級(jí)和運(yùn)行時(shí)層級(jí)同時(shí)保持實(shí)時(shí)和高效,為小型游戲、仿真軟件等系統(tǒng)提供了一個(gè)合理的控制器方案和框架.
首先,需要一個(gè)外層容器容納游戲整個(gè)生命周期中包括控制層的所有層次,且此容器為概念容器,無(wú)需被渲染. 結(jié)合通用游戲引擎軟件開發(fā)的理論及實(shí)踐,將具有這樣的特征的容器稱為“場(chǎng)景”,進(jìn)而把上述容器定義為主場(chǎng)景(MainScene)[4]. 現(xiàn)今,多數(shù)的游戲引擎有相同或相似的概念. 在此基礎(chǔ)上,以“層”為單位進(jìn)行規(guī)劃,主場(chǎng)景包含了主層,其余層為主層的子層或級(jí)聯(lián)子層,構(gòu)成游戲的框架,如圖1所示.
圖1 系統(tǒng)總體結(jié)構(gòu)
定義了系統(tǒng)邏輯上的關(guān)系之后,再圍繞游戲的核心框架定義時(shí)序關(guān)系. 如圖2所示.
游戲主要部分開始后,首先進(jìn)行一系列初始化,進(jìn)而轉(zhuǎn)入游戲的核心循環(huán). 在核心循環(huán)中,需要判斷是否有激活鍵值,即判斷用戶是否發(fā)出了指令,對(duì)該指令進(jìn)行即時(shí)反饋與處理. 同時(shí),一次次的循環(huán)伴隨著時(shí)間的流逝,隨著時(shí)間的推移,游戲?qū)⑴袛嗍欠裼|發(fā)了新的事件,對(duì)新事件進(jìn)行相關(guān)的處理,相應(yīng)地即時(shí)刷新游戲狀態(tài)[5].
框架構(gòu)成的系統(tǒng)采用MVC模式,并明確在cocos2d-x 3.x引擎中預(yù)定義的概念聯(lián)系. M(模型)在系統(tǒng)主體實(shí)現(xiàn)中可以認(rèn)為是各個(gè)存儲(chǔ)的特定數(shù)據(jù),以及節(jié)點(diǎn)的物理實(shí)體; 而V(視圖)可以認(rèn)為是我們?cè)诳梢暬庉嬈髦性O(shè)計(jì)的可視部分,以及各個(gè)節(jié)點(diǎn)的渲染子層(通常是Sprite類型); C(控制器)可視為M與V中的橋梁,也是控制層中最為關(guān)鍵部分.
在移動(dòng)平臺(tái)手機(jī)上,觸摸屏幕是操作游戲是基本方式. 所有有效的這一物理操作作用于設(shè)備上,經(jīng)一系列過程輸入給游戲程序,最后都應(yīng)該得到相應(yīng)的輸出,即轉(zhuǎn)化為游戲中對(duì)應(yīng)的實(shí)際效果[6].
控制層這個(gè)轉(zhuǎn)化過程中的重要的零件. 控制層在視圖方面顯示了按鈕,此外還作為控制器,控制器本身并不產(chǎn)生輸出或是做具體處理,而是接受用戶的命令并決定是否處理,交由誰(shuí)處理.
現(xiàn)以觸摸屏幕操作為起點(diǎn),游戲中對(duì)應(yīng)的實(shí)際效果為終點(diǎn),分析操作是如何一步步在內(nèi)部轉(zhuǎn)化的,以介紹了控制層實(shí)現(xiàn)模式及其工作原理,定義了控制層的框架和指令數(shù)據(jù)傳遞路徑,如圖3所示.
圖3 控制器框架與指令傳遞路徑
將給圖中的每一種形式編號(hào),分別稱為階段0,階段1,…,階段N. 以某個(gè)按鍵按下為例,闡述階段0是如何推演為階段N的,即在響應(yīng)狀態(tài)下某個(gè)抽象按鍵按下這一動(dòng)作,是如何轉(zhuǎn)換為游戲中“角色行動(dòng)”這一實(shí)際效果的.
(1) 階段0→階段1. 在外部界面設(shè)計(jì)軟件(如Cocos studio)中所設(shè)計(jì)的按鈕即是V的典型代表之一.當(dāng)左鍵按下時(shí),觸摸操作這一物理操作由硬件、操作系統(tǒng)等一系列內(nèi)部過程交由游戲程序處理. 由于控制層位于最頂層,最后該操作最終作用于在控制層UI視圖上.
(2) 階段 1→階段 2. 控制層 UI視圖是 Cocos studio中制作的,并導(dǎo)出出csb二進(jìn)制文件,由游戲程序在初始化時(shí)導(dǎo)入. 為了使該文件中有關(guān)按鈕的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為游戲程序可以接受的方式,使用如下代碼:
該語(yǔ)句在代碼中定義一個(gè)Button指針(即
(3) 階段2→階段3. 在控制層初始化過程中,為了接受響應(yīng),因此需要注冊(cè)偵聽器:
偵聽器的類型有很多種,對(duì)應(yīng)觸摸操作的是觸摸偵聽器(TouchListener). 由此,成功注冊(cè)偵聽器,按鈕被點(diǎn)擊后,偵聽器會(huì)檢測(cè)到該事件,同時(shí)調(diào)用在注冊(cè)偵聽器時(shí)所對(duì)應(yīng)的回調(diào)函數(shù).
(4) 階段3→階段4. 偵聽器在回調(diào)函數(shù)中判斷按鈕類型,并通知控制器打開或關(guān)閉指令狀態(tài)集. 有關(guān)函數(shù) void ControlLayer:BtnClick(cocos2d:Ref* pSender,TET touchType)的部分的具體實(shí)現(xiàn)如下:
pSender是事件的發(fā)出者,這里即指按鈕. 按鈕的name屬性標(biāo)識(shí)著各個(gè)不同的按鈕,可由getName()獲得此屬性. 究竟是打開還是關(guān)閉需要根據(jù)按鍵形式確定,這樣工作由BIN_SWITCH實(shí)現(xiàn).
CMD_ON/CMD_OFF這一對(duì)功能模塊用于打開或關(guān)閉處于M層級(jí)上的指令狀態(tài)集. 控制層中控制器的功能可由宏的形式生成分支語(yǔ)句實(shí)現(xiàn),也可以另外實(shí)現(xiàn)行為樹或狀態(tài)機(jī)等常見決策模型做出不同的處理.
在上一節(jié)中,我們已經(jīng)實(shí)現(xiàn)了控制層的一部分,即階段0→階段4. 然而,指令信息的形式如何以及CMD_ON/CMD_OFF的實(shí)現(xiàn)機(jī)制,它怎樣影響實(shí)際游戲,都是亟待解決的問題.
因此,我們提出了位變量緩沖器,其優(yōu)點(diǎn)在于用單變量就可以存取多個(gè)鍵的鍵值,還能改善游戲性能問題,更有利于識(shí)別指令形式,進(jìn)而目的性地綜合判斷處理. 算法的基本思想描述如下,其中maxPass為當(dāng)前已分配的通道數(shù):
使用“位變量”的方式在一個(gè)int型變量中存儲(chǔ)多個(gè)鍵值. 例如,取低16位分析,從低位到高位,每一位分別依次代表一種指令狀態(tài). 如b=0x8888可以代表指令狀態(tài)3,7,11,15呈現(xiàn)“開”的狀態(tài),其余“關(guān)”的狀態(tài).而c=0x8000僅有第15位為1,即“打開”狀態(tài),我們可以用c這樣的只有對(duì)應(yīng)位為1其余位均為0的通道去判斷b中的指令狀態(tài)15是否為打開狀態(tài). 當(dāng)b&c位運(yùn)算結(jié)果為非零時(shí),c通道的指令為打開狀態(tài). 此外,還可以以移位的形式循環(huán)處理指令狀態(tài).
在int類型許可的范圍內(nèi),第i個(gè)按鈕的對(duì)應(yīng)通道可以表示為(1<
“緩沖”是指CMD_ON/CMD_OFF并不立即調(diào)用執(zhí)行功能函數(shù),而只是將到來(lái)的命令緩存起來(lái). 當(dāng)其大體思想如下:在指令發(fā)出時(shí),并不立刻處理這個(gè)指令,而是將此指令以一定形式存儲(chǔ),交由游戲的其它模塊在合理的時(shí)機(jī)進(jìn)行一定的處理. 將“這種形式”即稱為指令狀態(tài)集,它的作用是識(shí)別指令形式和綜合判斷處理. 這樣除了可以改善性能問題之外,還能連續(xù)地處理輸出.
游戲核心循環(huán)的每一幀的update更新函數(shù)中按上述算法檢索緩沖器,實(shí)現(xiàn)階段5→階段6的轉(zhuǎn)換; 當(dāng)緩沖器打開時(shí),通知相應(yīng)的層或結(jié)點(diǎn)做相應(yīng)處理,以完成階段6→階段7的最終飛躍.
由于少量修改了cocos2d-x引擎,因此需要將引擎重新編譯,不能當(dāng)cocos2d-x作為靜態(tài)鏈接庫(kù).
為了驗(yàn)證本文設(shè)計(jì)的框架在不同壞境下的可靠性和效率,在CPU為ARMv7架構(gòu)2 GHz主頻,1 GB內(nèi)存的安卓手機(jī)以及CPU為Intel i3-4170,4 GB內(nèi)存的調(diào)試用主機(jī)上完成了測(cè)試. 測(cè)試的目標(biāo)為一款名為WAYHOME的開源游戲,該游戲使用的原始cocos2dx引擎版本為3.3,分別使用典型的自帶默認(rèn)控制器(稱為控制器A)和本文的框架下的控制器(稱為控制器B)進(jìn)行測(cè)試.
進(jìn)行安卓平臺(tái)上的測(cè)試. 輸入設(shè)備是觸摸屏. 該設(shè)備最大支持10點(diǎn)觸摸,但游戲所能接受的輸入類型種類為8. 因此,進(jìn)行了8點(diǎn)同時(shí)觸摸測(cè)試.
圖4 游戲的GL信息
可以看出該場(chǎng)景下,顯卡繪制的頂點(diǎn)數(shù)為3946,渲染次數(shù)為18,幀率為59.9 fps. 控制器A和控制器B在正常操作的前提條件下,均不會(huì)對(duì)游戲性能產(chǎn)生顯著影響.
但是在同時(shí)發(fā)出8種指令時(shí),情況有所區(qū)別. 使用控制器A的游戲畫面出現(xiàn)卡頓,幀率下降到了平均20.24 fps,且游戲中的人物的動(dòng)作表現(xiàn)不可預(yù)見性. 使用控制器B的游戲幀率平均為58.7 fps,在誤差允許范圍內(nèi),可以認(rèn)為沒有影響. 此外,游戲中的人物的表現(xiàn)有符合語(yǔ)義的相對(duì)確定性. 例如,“左”和“右”同時(shí)按下時(shí),根據(jù)矢量相加的“意圖”,人物在沒有外力干涉時(shí)應(yīng)保持靜止. 控制器A時(shí)而左行,時(shí)而右行,而控制器B大多數(shù)情況下保持了靜止. 可見,控制器B有一定的優(yōu)勢(shì).
本文研究并給出了一種基于游戲引擎的控制器框架. 首先分析設(shè)計(jì)了框架所構(gòu)成系統(tǒng)的基本結(jié)構(gòu),指出了控制層所處的位置以及和其它層方面的邏輯關(guān)系.然后,圍繞系統(tǒng)的核心循環(huán),分析設(shè)計(jì)了系統(tǒng)的時(shí)序關(guān)系. 由硬件底層出發(fā),在語(yǔ)言和視圖的級(jí)別追蹤和注冊(cè)了傳遞控制指令. 通過位變量來(lái)儲(chǔ)存和管理命令意圖,避免了復(fù)雜引用且對(duì)程序員在邏輯層面友好,同時(shí)保證了高效率. 通過通道的方式來(lái)緩沖輸入,保證在復(fù)雜并行輸入的同時(shí)保持程序的實(shí)時(shí)穩(wěn)定性. 最后,在實(shí)際的開源游戲中應(yīng)用了該框架,測(cè)試結(jié)果表明,相對(duì)于原有的默認(rèn)控制器,該框架更利于穩(wěn)定幀率、降低輸入延遲以及在極端情況下保證系統(tǒng)的穩(wěn)定性和表現(xiàn)方面更加符合自然語(yǔ)義.
1 Soni B,Hingston P. Bots trained to play like a human are more fun. Proceedings of the 2008 IEEE International Joint Conference on Neural Networks (IEEE World Congress on Computational Intelligence). Hong Kong,China. 2008.363-369.
2 徐盼欣. Unity 4.x從入門到精通. 北京:中國(guó)鐵道出版社,2013.
3 周飛龍. Cocos2d-X引擎中MVC框架的設(shè)計(jì)與實(shí)現(xiàn)[碩士學(xué)位論文]. 武漢:華中科技大學(xué),2013.
4 Wong M,IBM XL編譯器中國(guó)開發(fā)團(tuán)隊(duì). 深入理解C++ 11:C++ 11新特性解析與應(yīng)用. 北京:機(jī)械工業(yè)出版社,2013.
5 朱成亮. 基于Android平臺(tái)游戲引擎的設(shè)計(jì)與實(shí)現(xiàn)[碩士學(xué)位論文]. 淮南:安徽理工大學(xué),2011.
6 張萌. 基于動(dòng)作軌跡識(shí)別的游戲控制系統(tǒng)設(shè)計(jì)[碩士學(xué)位論文]. 重慶:重慶大學(xué),2013.