走在網頁游戲開發的路上(十)


頁游資源管理

現在頁游的規模越來越來大,游戲內容豐富,資源管理變得很重要。現在一款SNS頁游的所有資源可達50MMMO頁游更高達幾百M,不可能把資源放到一個文件里面、也不可能一次性加載完所有資源。按200kb/s的下載速度來算,50M的資源需要4+分鍾,這是絕對不能忍受的事情(更何況大部分人網速比這慢)。

頁游資源通常有以下幾種格式:圖片(jpgpng等)、xml(配置文件)、swf資源、聲音文件。通常有以下手段來管理資源,並解決進入游戲慢的問題:

l  配置文件壓縮打包

l  資源細化分離,按需加載

l  模塊化編程,按模塊加載

l  資源緩存

l  資源預加載

l  使用CDN部署資源

1.   配置文件壓縮

頁游需要10幾,20幾個配置文件這是很常見的,配置文件現在流行使用xml格式。可以通過壓縮軟件打包,flash通過二進制方式加載壓縮包之后解壓使用。這樣一方面減少連接請求數另一方減少了流量

2.   資源細化分離,按需加載

分離各類模塊和素材(圖片、swf文件),方便實現按需加載。整個游戲的資源size很大,但是進入游戲往往並不需要所有的資源。這樣我們可以分離各類模塊和素材,所有資源通過配置文件管理。整理出進入游戲需要的必加載資源,剩余資源只在需要的時候再加載,以減少進入游戲的時間。分離各類模塊和素材,還要一個好處就是減少單個資源的size,降低資源下載失敗的情況

按需加載的流程如下:

l  判斷資源是否可用(是否已經加載過);

l  如果已經加載,直接使用即可;

l  否則加載資源,下載完成后才使用。

這里有點需要注意 如何判斷一個資源是否已經加載過?一般加載過的資源,我們會緩存在內存中(這樣下次使用資源無需再次加載),加載過的資源使用一個Dictionary管理(以資源urlkey,資源內容為值。注意不用使用數組保存資源,使用字典會比遍歷數組查找名稱快很多),通過資源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加載的文件緩存被沖洗掉,你可以將加載的文件的二進制數據(LoadercontentLoaderInfo.bytesURLLoader則要用二進制方式加載獲取其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加速頁游其實和加速網站差不多,參考方案:《網頁游戲加速解決方案交流》(百度文庫)。

clip_image002

clip_image004

clip_image006

你可能感興趣的還有:

ü  走在網頁游戲開發的路上(一)

ü  走在網頁游戲開發的路上(二)

ü  走在網頁游戲開發的路上(三)

ü  走在網頁游戲開發的路上(四)

ü  走在網頁游戲開發的路上(五)

ü  走在網頁游戲開發的路上(六)

ü  走在網頁游戲開發的路上(七)

ü  走在網頁游戲開發的路上(八)

ü  走在網頁游戲開發的路上(九)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM