(源碼依舊在Jar中)
源碼下載地址:http://code.google.com/p/loon-simple/downloads/list
老實說,延遲下載游戲資源及調用只是一種輔助手段,與游戲開發本身關系并不大,實質也無非只是文件下載及文件讀取的混用。但考慮到上周有網友問及此類問題,筆者覺得與其回郵件單獨解釋,倒不如寫篇博文看起來更具體清晰,還能令大家幫助筆者斧正刊誤,故成此文,僅供參考。
一般來講,我們之所以會需要通過下載方式加載游戲資源,無非是出于如下幾種目的:
1、精簡游戲體積:
假設我做了個100MB的游戲,卻非想把它宣傳成僅有1MB的精巧程序,這時我該怎么辦呢?
去欺騙用戶,用大量復雜的技術名詞忽悠他們說1MB和100MB等值嗎?——用戶不是傻子,至少不都是傻子,無論你的話術多么巧妙,也很難讓絕大部分人都相信1MB和100MB是一樣的。但大話已然出口,始終要想辦法解決。
其實呢,在現有技術體系下,要搞定他們好簡單的,只需將游戲初始界面混合下載器打包成1MB的文件發布,再“騙”他們下載執行,而后——就讓他們慢慢等待系統加載剩下那99MB吧!畢竟沒人說過這個游戲不需要額外的網絡資源同步嘛……
2、網游資源的延遲加載需要:
目前的網絡游戲——特別是網頁游戲,為了盡可能的減少不必要的資源損耗,提高運行效率,大多數時候并不會一口氣將所有資源都加載到游戲中,而是“大而化之,分而治之”,將游戲資源構建成一個個小小的資源包,僅僅在需要時,才或同步、或異步的加載到游戲中。這也正是我們在很多網游中所見到的,當角色過屏、讀取新地圖或遭遇新怪物時,畫面會出現稍候字樣或者部分馬賽克乃至停頓的原因。
故此,通過網絡適時地去加載需要的資源,幾乎已成為網游開發中必不可少的技巧之一。
3、融入特殊的加密解密機制:
我們都知道,但凡是人所做出的程序,就沒有人所不能破解掉的。但是——卻很可能發生一個人做出來的程序,另一個人數年之內無法破解的現象。而當數年之后,另一個人破解出來時,這段程序卻早已過氣,白送都沒人要了。
因此,當你極端的不想自己游戲被反向工程——尤其是想保護Java這種極好反編譯的代碼時,通過網絡下載的另一種意義便顯現出來了。你可以將下載的jar或class乃至其它種種保存到一個不同于執行目錄的“隱秘”場所,并且無論密鑰也好,特殊結構也罷,總之變著方的將資源加密混淆,就算混淆到連你自己都不知道這是什么東西也無所謂——能解釋成字節碼就好,最大限度的增加反向難度。而當你執行完畢,再一刪了事——下次還可以再下嘛。這樣做的話,雖然不能徹底杜絕代碼被他人盜用,但,至少也可讓反向我代碼那哥們累掉層皮(^^)。
4、本地程序及資源合法性驗證:
在大多數網絡游戲中,為了保證用戶不做出一些諸如使用外掛的“犯規”行為,是會對系統環境乃至封包數據進行合法性驗證的,而一旦發現“非法”的東西存在,則會令“違法”玩家吊線或者干脆封號以示懲罰。
但這些驗證,主要都只針對程序“外部”,即當“犯規”對象“不是我的游戲時”才能發揮功效,但萬一“犯規”者“來自游戲本身時”或者“驗證程序認為來自游戲本身時”,則變得無能為力,這也是為什么大多數網游都“內掛”泛濫的緣故。
幸運的是,Java程序由于其“天資所限”,是很難在虛擬機外部被攻破利用的,如果用Java制作網游,原則上大可不必擔心“內掛”問題——但,這也有個大前提,那就是在“內掛”運行于虛擬機之外時才行的通。
而如果“內掛”運行在虛擬機之內呢? 如果我的“內掛”是一小段插入原始游戲中的代碼呢? 要知道,動態加載class,動態修改字節碼,早就不算什么事情了。
這時,就需要校驗Java程序的合法性。
本來要驗證這種事情是比較耗費時間的,但如果我們善于利用每次下載資源(比較大的,比如過圖或者游戲更新),如果不單單“下載”,更同步“上行”,利用空檔同服務器校對本地Java程序的合法性及完整性,便能很大程度上避免這種無意義的校驗時間浪費。這時有缺少的文件便添加,有多余的——也就是出現不該存在的Jar或class乃至原始字節碼修改,便借機強行“咔”掉它,免得它“為禍人間”。
5、系統升級:
通常來說,大多數的程序是不可能一個版本用到底的,游戲也不例外,無論是功能的增加或者Bug修正都離不開系統的更新。為了避免每次升級都令用戶面臨重裝的苦惱,通過網絡下載更新資源并自動更新系統也就變得非常必要。
如何實現:
下面我給出一個簡單的資源延遲下載Java實現示例,分別加載我以前博文中出現的兩個示例程序,并運行其中之一。(PS:由于本例加載的資源為Jar,所以進行了動態類加載操作,當我們下載其它資源類型,比如僅包含圖片的zip壓縮文件時,下載的步驟還是一致,只不過要將操作換成讀取壓縮文件及加載壓縮文件資源而已。)
DownloadTool.java(這是一個簡單的下載工具類,內置有下載狀態顯示及下載條繪制)
DownloadCanvas.java(下載條及背景顯示用畫布)
Main.java(主類,用以啟動此下載示例)
程序執行效果如下圖所示:

下載完畢后后將自動加載并執行下載的Java2.5D行走示例,畫面如下圖:

(源碼依舊在Jar中)
浙公網安備 33010602011771號