《星際》、《魔獸》、《文明》……這些都是PC游戲玩家們耳熟能詳?shù)拿?,可以說以這些游戲為代表的戰(zhàn)略游戲是PC游戲的典型代表,戰(zhàn)略游戲的玩家也是眾多PC游戲類型里忠誠度的玩家。戰(zhàn)略游戲分為回合制和即時戰(zhàn)略兩類,兩種戰(zhàn)略游戲都有數(shù)量眾多玩家,而后者更因為緊張激烈的游戲性逐漸壓倒了回合制戰(zhàn)略游戲,近幾年來,一直在戰(zhàn)略游戲中占統(tǒng)治地位。
在“J2ME平臺上開發(fā)網(wǎng)絡即時戰(zhàn)略游戲”,這個話題在現(xiàn)今大多數(shù)J2ME 開發(fā)者聽來無異于天方夜譚。即時戰(zhàn)略游戲名字的“即時”兩個字決定了復雜的運算和數(shù)據(jù)交互、穩(wěn)定快速的網(wǎng)絡連接要求、龐大的資源和繪制任務,我們都知道J2ME設備的資源和性能都極為有限,現(xiàn)有GPRS網(wǎng)絡業(yè)不盡如人意……這些似乎都成為了在J2ME上開發(fā)網(wǎng)絡即時戰(zhàn)略游戲不可逾越困難。
困難實實在在的擋在我們面前,但中國三億手機用戶中蘊藏的龐大的潛在即時戰(zhàn)略玩家促使我們?nèi)タ朔@些困難,只要還有一點可能,我們也要去尋找一條跨過這些障礙的道路。怎么樣才能在手機上實現(xiàn)網(wǎng)絡即時戰(zhàn)略游戲呢?
從性能和用戶量考慮,我們選擇諾基亞的60系列作為初期的開發(fā)平臺。
我們不考慮采用HTTP協(xié)議,雖然它是J2ME設備中普遍采用的協(xié)議,但其相對SOCKET的低效性和本身是無連接協(xié)議決定了它不適合即時戰(zhàn)略這種游戲形式。從上表可以看出建立連接的時間要高出連接后的數(shù)據(jù)傳送時間許多,HTTP協(xié)議需要花費許多額外開銷在建立連接上;HTTP平均的數(shù)據(jù)傳送時間也要比SOCKET高許多。我們測試了大部分的60機型(7650, 3650, 3660, 6600, N-GAGE, N-GAGE QD),所有測試的機型均支持socket。
從上表可以看出,socket連接數(shù)據(jù)往返一次的平均時間在1 ~ 2秒間,這對回合制的戰(zhàn)略游戲或許足夠,但對即時戰(zhàn)略游戲來說還是太長了。有什么辦法能大幅壓縮數(shù)據(jù)傳送的時間呢?
我們可以從server和數(shù)據(jù)包協(xié)議考慮。
以上測試的服務器是用Serverlet寫的,而serverlet是構建在Web server上的,那么這個數(shù)據(jù)里包含的服務器反應和處理的時間就不容忽略了,為了獲得更快的響應和處理速度,我們必須重新設計和構建游戲的專用Server。傳送的數(shù)據(jù)包大小也是影響速度的一個關鍵。平時大家開發(fā)J2ME的網(wǎng)絡應用,習慣于用文本流來傳送數(shù)據(jù),因為大多數(shù)應用Server端都是基于Web Server,而且采用文本表示信息非常直觀,也便于Server處理,但對于J2ME平臺和gprs網(wǎng)絡來說,沒有經(jīng)過壓縮的文本還是浪費了一些。
簡單考慮一下游戲服務器:一臺主機應該能支撐一百到兩百名玩家同時在線;為了便于配置,Server應用應該是跨平臺的,而客戶端也是J2ME的,因此Server的開發(fā)環(huán)境java當是;采用Java 1.4后新增的Java 異步通信功能,性能上也能達到我們的要求。
因為Server必須我們自己寫,所以沒有必要使用文本編碼協(xié)議,代之以字節(jié)流編碼。簡單估算一下,表示相同的信息,采用文本和字節(jié)編碼方式數(shù)據(jù)大小的比例大于4:1,而且數(shù)據(jù)本來以數(shù)字為主,省去了文本轉換的一大筆開銷。更小的數(shù)據(jù)相應的也帶來了更快的速度,另外,也為用戶節(jié)省了大筆昂貴的GPRS流量開支。
采取以上的措施后,我們再次測試了數(shù)據(jù)傳送的響應時間,平均小于1秒!也許在很多人看來,這個時間還是太長,達不到實時的要求,但應該知道,的實時是不可能實現(xiàn)的,只要在策劃和開發(fā)中采用一些合理的策略,這小于1秒的延遲完全可以很好的掩蓋。
典型的PC即時戰(zhàn)略游戲如《星際》,在局域網(wǎng)對戰(zhàn)時實際上并不需要服務器的,對戰(zhàn)中的一臺或多臺客戶機充當了服務器的角色,即使是上戰(zhàn)網(wǎng),戰(zhàn)網(wǎng)服務器完成的也只是社區(qū)管理的工作。在手機上實現(xiàn)不能采取這種結構:首先,通過GPRS網(wǎng)絡,兩部手機無法直接連接(不排除藍牙或紅外的互連,這不在我們的討論范圍內(nèi)),只能通過服務器中轉;另外,手機的運算能力有限,為了游戲能良好的運行,必須把很多的運算轉移到資源相對更豐富的Server端,這和一般的CS結構中,盡量讓Client分擔Server的工作以使得Server能支撐更多的Client的做法背道而馳,也體現(xiàn)了J2ME網(wǎng)絡應用的特殊性吧:)
再簡單說一下整個系統(tǒng)的架構:
服務器按功能分為連接服務器、大廳服務器、游戲邏輯服務器、用戶管理服務器和日志服務器五種。視用戶的數(shù)量,如果數(shù)量很小,所有的服務器都可以置于一臺主機中;隨著用戶量增多,各服務器可以移動到不同的主機中,通過調整各服務器主機的數(shù)量達到均衡負載。
以上是我的一家之言,很多地方可能不盡合理,歡迎大家指正。另外,敬請關注招商迪辰天空數(shù)碼即將推出的國內(nèi)手機網(wǎng)絡即時戰(zhàn)略游戲:《英雄――決戰(zhàn)天下》。歡迎到天空數(shù)碼論壇進行關于此類游戲的討論!