摘要:單機版編程型游戲不支持多人在線游戲,其應用范圍受到限制。介紹了網絡版編程型游戲的通信模型、軟件組成、控制流程和網絡同步技術。
關鍵詞:編程型游戲;通信模型;服務器程序;網絡同步
Communication Model and Technology Relating to Programming Games
JIANG Geng-hao
(Education Department of Hanshan Normal University, Chaozhou 521041, China)
Abstract: Single-tiered Programming Games do not support multi players' online games since it's application range is limited. This paper describes the Communication Model,including its software, control flows and network synchronization technology based on the network.
Key words: programming games; communication model; server application; network synchronization
編程型游戲(Programming Game)是一類具有教學、科研功能的計算機游戲,既可用于計算機程序設計課程教學,也可用于人工智能領域研究。編程型游戲通常以“競技仿真引擎”的形式出現,與其它游戲的主要區別在于其游戲方式:游戲者編寫程序控制自己的游戲角色,將其放至競技場與其它游戲角色進行競技;在游戲過程中,游戲角色的行為不是由鍵盤、鼠標或游戲操縱桿等輸入設備進行控制,而是由游戲者事先為其設計的程序自動進行控制,面對隨機出現的情況作出合理判斷并采取相應的反應動作。出于仿真的需要,編程型游戲中每個游戲角色都擁有一個獨立的線程,稱為角色線程。為了使各個角色線程能夠公平獲得處理器時間,由游戲引擎的“競技調度線程”依次對它們進行機會均等的調度。
目前,典型的編程型游戲(如robocode、AI-TANK、AI-RCJ等)都是單機版的,不支持多人在線游戲,其應用范圍受到限制。在借鑒相關研究成果基礎上,研究支持多人在線游戲的網絡版編程型游戲的通信模型和相關技術。
1 網絡版編程型游戲的通信模型
網絡版編程型游戲屬于多人游戲(multi-player game),可以同時讓多個游戲者通過網絡參與游戲,游戲者在各自的計算機上運行游戲軟件并控制著各自的游戲角色。在游戲過程中,游戲狀態將通過網絡傳輸進行同步更新。由于網絡傳輸會出現一定程度的延遲,所以可能會影響游戲運行的流暢性。為盡量消除“網絡延遲”所帶來的影響,游戲引擎必須采用合適的通信模型。典型的通信模型包括“端對端”模型和“客戶端/服務器”模型。
1.1 “端對端(P2P)”模型
P2P模型是一種比較簡單的通信模型,具有網狀的邏輯結構,如圖1所示。因為多人游戲必須保證同一時刻所有游戲者的游戲狀態是一致的,所以通常會在內部維護統一的游戲狀態數據庫。在P2P模型中,每個游戲者的計算機上保存一份游戲狀態數據庫的完整副本,并各自獨立地處理著游戲的全部邏輯。當某個游戲者的游戲狀態發生變動時,修改的數據會發送給其他游戲者以便及時更新他們的數據庫。如果有N個游戲者同時參與游戲,那么一個游戲者的一次變動必須發送給其他(N-1)個游戲者。如果所有的游戲者都發生變動,那么將有N×(N-1)條消息需要傳輸,當人數增加時,由網絡傳輸引起的延遲時間將呈二次方的比例增長。
1.2 “客戶端/服務器(C/S)”模型
C/S模型具有星形的邏輯結構,如圖2所示。C/S模型中,服務器扮演了仲裁人的角色,統一處理所有客戶端共享的游戲邏輯,收集所有的游戲狀態信息并集中存儲在一個游戲狀態數據庫中。每個客戶端保持一份游戲狀態數據庫的子集,并且只處理與自身相關的部分游戲邏輯。游戲過程中,客戶端只與服務器進行信息的發送和接收。如果游戲狀態發生變動,那么服務器只須發送N條消息即可完成更新。與P2P模型不同的是,C/S模型必須額外在服務器上運行一個服務器程序。
1.3 通信模型的選擇
兩種通信模型各有優缺點,P2P模型無需額外運行服務器程序,但需要進行較為頻繁的網絡連接和信息發送。C/S模型集中管理游戲邏輯和狀態,在管理多個游戲者的游戲會話方面具有優勢,但需要額外運行服務器程序,增加了游戲引擎的復雜度。
編程型游戲與其它游戲的最大差別在于游戲過程中游戲者不能通過鍵盤、鼠標或游戲操縱桿等輸入設備來控制游戲角色。游戲運行時不再與游戲者進行實時的交互,而是循環進行“執行游戲的一幀→渲染游戲的一幀→游戲者觀看游戲的一幀”直至游戲結束的過程。由于各個游戲角色由程序自動控制,狀態變化通常很快,如果采用P2P模型,不僅要發送各個游戲角色的狀態變化消息,還要發送處理結果等消息,這將會導致大量的消息發送,容易受到“網絡延遲”的影響;如果采用C/S模型,網絡通信量將大為減少,受“網絡延遲”的影響不明顯。另外,C/S模型還可以充分利用兩端硬件環境的優勢,將計算任務合理分配到客戶端和服務器完成。因此,可以采用C/S模型來管理網絡版編程型游戲的網絡通信。
2 網絡版編程型游戲的軟件組成
游戲軟件由客戶端程序和服務器程序兩部分組成,如圖3所示。客戶端程序包括游戲者管理模塊、競技監視模塊和代碼編輯模塊。其中,游戲者管理模塊主要負責為游戲者參加游戲、設置仿真參數(如:控制聲音效果、視覺效果等)、控制游戲角色等提供用戶界面。競技監視模塊負責對競技進行仿真,并在屏幕顯示一個虛擬競技場和各個游戲角色的活動情況。代碼編輯模塊負責為游戲者編寫、調試、編譯角色控制程序提供用戶界面。
服務器程序包括競技管理模塊和競技記錄模塊。其中,競技管理模塊是整個游戲的核心,負責控制游戲的全過程,維護游戲的物理模型和游戲狀態數據庫。競技記錄模塊負責保存游戲過程中競技場的活動情況,實現“競技過程回放”功能。
3 服務器程序的控制流程
服務器程序運行時創建兩個線程——主線程A和守護線程B。線程A在初始化服務器后,首先啟動線程B,然后開始監聽某一個網絡端口,響應客戶端程序的請求。在線程B的每一輪循環中,檢查是否有兩個以上游戲者在線,若有則檢查“競技開始標志”,該標志為“真”時啟動“競技調度線程”(競技調度線程開始調度已經準備就緒的角色線程)并等待競技結束,競技結束后根據服務器的開關標志決定繼續新一輪循環或關閉服務器。線程A、B的控制流程如圖4、5所示。
當線程A監聽到新的客戶端請求時,便創建一個游戲者線程。每一個游戲者線程負責與對應的客戶端程序通信,可看作遠程的游戲者在服務器上的代理,在游戲者退出游戲時被銷毀,其控制流程如圖6所示。游戲開始時,服務器給競技場分配一個“競技調度線程”,給每個游戲角色分配一個角色線程,競技場使用的線程數量N=Players×2+1 (Players代表參與游戲的人數),競技結束后由服務器釋放這些線程資源。
說明:
① 設置的內容包括“是否在競技結束時向客戶端回傳競技記錄”等。
② 服務器為游戲角色分配一個線程并使之掛起,等待競技管理線程的調度。
③ 在線的游戲者中,其IP地址與服務器相同者擁有對競技的控制權;如果沒有一個游戲者的IP與服務器相同,則第一個登錄服務器的游戲者擁有對競技的控制權。
④ 通過設置“競技開始標志”為真,通知守護線程B啟動競技調度線程。
⑤ 由競技調度線程將“競技開始標志”設置為假;復位各游戲角色的狀態;向申請“回放競技過程”的客戶端回傳競技過程記錄。
4 網絡同步技術
同步是指使多個事件(如實體狀態信息)按照一定的時間順序進行傳輸和表現的一種控制策略。網絡游戲的同步有兩種,一種是服務器與客戶端之間的同步,它保證了客戶端維護的游戲模型與服務器上的游戲模型的一致性;另一種是客戶端之間的同步,它保證了每個游戲者在屏幕上看到的東西大體是一樣的,對于編程型游戲而言,我們更關心的是前一種同步。
實現同步最簡單的方法是讓客戶端同期性地從服務器鏡像游戲狀態數據庫。這種方法主要的缺點是可能會錯過兩次采樣之間發生的一些事件。為了解決這個問題,可以使用事件驅動的服務器端“推”技術。當服務器上游戲狀態更新頻繁時,該技術能夠保證任何瞬間的狀態變動都會被傳遞到客戶端。采用這種技術,服務器上的游戲狀態數據庫和客戶端的副本之間的同步是使用“更新事件”進行管理的。“更新事件”僅包含足夠表示自上一次更新以后所發生變動的信息。服務器對事件進行連續編號,如果客戶端在規定時間內沒有收到“更新事件”,或收到的事件不連續,客戶端必須檢測到同步的失敗并請求對整個游戲狀態的完全更新。采用這種技術的另一個好處是,當服務器上的虛擬游戲世界中沒有發生任何事件時,客戶端和服務器之間的通信量幾乎為零,能夠有效地減少網絡通信量。
5 結束語
編程型游戲是一類具有教學、科研功能的計算機游戲。單機版的編程型游戲不支持多人在線游戲,其應用范圍受到限制。目前,計算機游戲正在往“網絡化”方向發展,這也是編程型游戲的發展趨勢。
參考文獻:
[1] Watt A,Policarpo F.3D游戲(卷1)實時渲染與軟件技術[M].北京:機械工業出版社,2005:405-407.
[2] Croft D W.Java游戲高級編程[M].北京:清華大學出版社,2005:379-381.