頁游資源管理
現在頁游的規模越來越來大,游戲內容豐富,資源管理變得很重要。現在一款SNS頁游的所有資源可達50M,MMO頁游更高達幾百M,不可能把資源放到一個文件里面、也不可能一次性加載完所有資源。按200kb/s的下載速度來算,50M的資源需要4+分鍾,這是絕對不能忍受的事情(更何況大部分人網速比這慢)。
頁游資源通常有以下幾種格式:圖片(jpg、png等)、xml(配置文件)、swf資源、聲音文件。通常有以下手段來管理資源,並解決進入游戲慢的問題:
l 配置文件壓縮打包
l 資源細化分離,按需加載
l 模塊化編程,按模塊加載
l 資源緩存
l 資源預加載
l 使用CDN部署資源
1. 配置文件壓縮
頁游需要10幾,20幾個配置文件這是很常見的,配置文件現在流行使用xml格式。可以通過壓縮軟件打包,flash通過二進制方式加載壓縮包之后解壓使用。這樣一方面減少連接請求數;另一方減少了流量。
2. 資源細化分離,按需加載
分離各類模塊和素材(圖片、swf文件),方便實現按需加載。整個游戲的資源size很大,但是進入游戲往往並不需要所有的資源。這樣我們可以分離各類模塊和素材,所有資源通過配置文件管理。整理出進入游戲需要的必加載資源,剩余資源只在需要的時候再加載,以減少進入游戲的時間。分離各類模塊和素材,還要一個好處就是減少單個資源的size,降低資源下載失敗的情況。
按需加載的流程如下:
l 判斷資源是否可用(是否已經加載過);
l 如果已經加載,直接使用即可;
l 否則加載資源,下載完成后才使用。
這里有點需要注意 – 如何判斷一個資源是否已經加載過?一般加載過的資源,我們會緩存在內存中(這樣下次使用資源無需再次加載),加載過的資源使用一個Dictionary管理(以資源url為key,資源內容為值。注意不用使用數組保存資源,使用字典會比遍歷數組查找名稱快很多),通過資源url就可判斷資源是否已經加載過。或者通過applicationDomain.hasDefinition(className),查找資源中的鏈接類是否可以在應用程序域中找到,因為加載通常會制定一個應用程序域,加載過的資源可以直接從域中讀取。
我做過的幾個游戲進入游戲必加載資源必須盡量小,這樣可以保證玩家可以快速進入游戲,這也是一個硬性指標,按需加載是必須的!
3. 按模塊加載
模塊細化:按照程序邏輯,游戲可以拆分出多個模塊,如“登陸模塊”、“副本模塊”、“任務模塊”、”關系鏈模塊“等等;按照游戲中的關卡或場景,可以拆分出不同的“場景模塊”。這些模塊不是主程序運行必須的,只在需要的時候加載。
這點其實跟第二點“按需加載”是一樣的,這里更關注游戲如何進行模塊划分使得程序可以按需加載。模塊划分主要包括“核心模塊划分”和“子模塊划分”。核心模塊的划分思路是這樣的:它們是游戲啟動所必須的,相互之間是緊密聯系的,還要經常的被子模塊調用;而相對的,子模塊的划分思路是:他們在游戲啟動過程中不是必須的,可以在游戲過程中再加載,子模塊相互之間基本上完全沒有聯系,一個子模塊的增加和刪除不會影響到任何其他子模塊,子模塊可能需要調用主程序的接口或者獲得主程序的數據,但主程序絕對不應該依賴某個子模塊。
明確了模塊划分思路再具體看看哪些部分應該划分為核心模塊,哪些部分應該划分為子模塊。一般情況下,核心模塊按照游戲啟動順序大致包括: 加載殼SWF → 登錄注冊SWF → 灰度控制文件 → 主程序SWF → 配置文件包 → 公共素材包 → 主UI需要的資源 。
注:
l 加載殼SWF一般很小(50K左右,小於100K),只包含2個功能:1)登錄注冊、灰度控制;2)加載主程序swf。加載完主程序swf,加載殼就完成自己的工作,主程序swf接管程序控制權。盡量最小化加載殼的功能,以保證調整或增加功能不用修改加載殼。
l 接入第三方平台時,如騰訊,”登錄注冊SWF“不需要,統一使用頁面登錄框。
l 公共素材包,除了抽取的普通資源swf包,還可以是共享庫的形式:UI共享庫、Font字體共享庫。
l 把公告素材包、主UI需要的資源放在”注程序SWF“之后,否則需要把配置文件包、加載公共資源等工作放到加載殼中去做。如果其中使用到的公用類被修改、項目運營中頻繁運營造成修改配置文件和資源管理方式,加載殼就得重新編譯發布,違反了”最小化加載殼的功能“規則。
4. 資源緩存
Flash頁游可用的緩存有以下幾種形式:內存、瀏覽器緩存、ShareObject (flash特有的)。游戲查找資源,通常按照:內存 ==> ShareObject / 瀏覽器緩存 ==> 服務器的順序檢查。緩存的使用可以給玩家非常好的體驗(只在第一次加載時耗時久),這樣整體游戲會感覺流暢,不會每次切換場景等都要等待從服務器加載資源的時間。
前面介紹過一般加載過的資源,我們會緩存在內存中(這樣下次使用資源無需再次加載),加載過的資源使用一個Dictionary管理。但是內存資源是有限且寶貴的,通常只駐留常用的資源。對於其他資源,這時ShareObject / 瀏覽器緩存就很有用,比從服務器拉取速度快、並且節省流量。
4.1. 瀏覽器緩存
關於瀏覽器緩存可以參考文章:瀏覽器緩存機制。(http://goo.gl/SaHt0)
4.2. ShareObject
這里需要理解下為什么有了瀏覽器緩存,as3還搞個ShareObject?雖然有瀏覽器緩存,但實際上這種緩存持續不了幾天,因為瀏覽器一向都有最大緩存限制。一般你看幾個視頻,這個緩存空間就消耗得差不多了。為了不讓Flash加載的文件緩存被沖洗掉,你可以將加載的文件的二進制數據(Loader是contentLoaderInfo.bytes,URLLoader則要用二進制方式加載獲取其data屬性)保存在ShareObject里,並添加版本號以便更新,下次加載就直接取這個數據。這個操作會請求大量ShareObject空間,因此FLASH會彈出提示讓用戶確認(ShareObject默認是100K的大小,超過這個大小需要用戶確認)。如果你擔心用戶不確認,可以在游戲其他地方向用戶說明情況並要求他們點擊確認按鈕,現在已經有很多MMO頁游這么做了。
Shareobject示意 |
var so:SharedObject = SharedObject.getLocal("resName_v1"); if (so.size == 0) { // 共享對象不存在。 trace("created..."); so.data.res = bytes; so.data.ver = “v1”; } trace("SharedObject is " + so.size + " bytes"); so.flush(); |
5. 資源預加載
空閑的時候,預加載核心資源;或者根據玩家特點預加載需要的資源。
l 根據玩家的操作,預判下一步要做的操作,預加載相應資源,這個要具體游戲具體分析。
l 幫核心玩家預加載所有核心資源。如核心QQ農場玩家同時會玩QQ牧場,並經常在這2個模塊之間切換,在玩家進入QQ農場空閑時預加載牧場的資源。
資源預加載技術上不難,關鍵是要找到合適的時間,加載對的資源。
6. 使用CDN加速
關於CDN-內容推送系統可以文考文章:CDN-內容推送系統(http://goo.gl/H7Llw)。 現在我所在公司所有的頁游都使用CDN技術。CDN技術也在各大門戶網站實踐使用。
關於CDN加速頁游其實和加速網站差不多,參考方案:《網頁游戲加速解決方案交流》(百度文庫)。
你可能感興趣的還有: