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