Java遊戲中延遲下載資源及調用示例

火星人 @ 2014-03-10 , reply:0


老實說,延遲下載遊戲資源及調用只是一種輔助手段,與遊戲開發本身關係並不大,實質也無非只是文件下載及文件讀取的混用.但考慮到上周有網友問及此類問題,筆者覺得與其回郵件單獨解釋,倒不如寫篇博文看起來更具體清晰,還能令大家幫助筆者斧正刊誤,故成此文,僅供參考.

一般來講,我們之所以會需要通過下載方式載入遊戲資源,無非是出於如下幾種目的:

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行走示例,畫面如下圖:

源碼:

JarDownloadSimple.jar Java遊戲中延遲下載資源及調用示例 109K
Java25DSimple.jar Java2.5D遊戲開發入門示例代碼-0.1 315K

loon-simple-20090212.zip
loon-simple-20090212(此為非框架開發的Java2D遊戲開發示例及源碼) 4.2M




[火星人 via ] Java遊戲中延遲下載資源及調用示例已經有112次圍觀

http://www.coctec.com/docs/java/show-post-61736.html