1. 程式人生 > >cocos creator 熱更新 解釋命令

cocos creator 熱更新 解釋命令

原帖地址:http://forum.cocos.com/t/cocos-creator/35639

使用前先在cocos creator 專案-》構建釋出-》進行非web平臺的構建和編譯!!!

# 資源熱更新教程

## 前言

之所以這篇文件的標題為教程,是因為目前 Cocos Creator 資源熱更新的工作流還沒有徹底整合到編輯器中,不過引擎本身對於熱更新的支援是完備的,所以藉助一些外圍指令碼和一些額外的工作就可以達成。

## 使用場景和設計思路

資源熱更新的使用場景相信遊戲開發者都非常熟悉,對於已釋出的遊戲,在遊戲內通過從伺服器動態下載新的遊戲內容,來時刻保持玩家對遊戲的新鮮感,是保持一款遊戲長盛不衰非常重要的手段。當然熱更新還有一些其他的用途,不過在此不再深入討論,我們下面將主要討論 Cocos Creator 對熱更新支援的原理和手段。

Cocos Creator 中的熱更新主要源於 Cocos 引擎中的 AssetsManager 模組對熱更新的支援。它有個非常重要的特點:

[color=#ff0000]服務端和本地均儲存完整版本的遊戲資源[/color],熱更新過程中通過比較服務端和本地版本的差異來決定更新哪些內容。這樣即可天然支援跨版本更新,比如本地版本為 A,遠端版本是 C,則直接更新 A 和 C 之間的差異,並不需要生成 A 到 B 和 B 到 C 的更新包,依次更新。所以,在這種設計思路下,新版本的檔案以離散的方式儲存在服務端,更新時以檔案為單位下載。

除此之外,由於 WEB 版本可以通過伺服器直接進行版本更新,所以資源熱更新只適用於原生髮布版本。AssetsManager 類也只在 jsb 名稱空間下,在使用的時候需要注意判斷執行環境。

## Manifest 檔案

對於不同版本的檔案級差異,AssetsManager 中使用 Manifest 檔案來進行版本比對。本地和遠端的 Manifest 檔案分別標示了本地和遠端的當前版本包含的檔案列表和檔案版本,這樣就可以通過比對每個檔案的版本來確定需要更新的檔案列表。

Manifest 檔案中包含以下幾個重要資訊:

[list=1][li]遠端資源包的根路徑[/li][li]遠端 Manifest 檔案地址[/li][li]遠端 Version 檔案地址(非必需)[/li][li]主版本號[/li][li]檔案列表:以檔案路徑來索引,包含檔案版本資訊,一般推薦用檔案的 md5 校驗碼來作為版本號[/li][li]搜尋路徑列表[/li][/list]
其中 Version 檔案內容是 Manifest 檔案內容的一部分,不包含檔案列表。由於 Manifest 檔案可能比較大,每次檢查更新的時候都完整下載的話可能影響體驗,所以開發者可以額外提供一個非常小的 Version 檔案。AssetsManager 會首先檢查 Version 檔案提供的主版本號來判斷是否需要繼續下載 Manifest 檔案並更新。

[b]

在 Cocos Creator 專案中支援熱更新

[/b]

在這篇教程中,將提出一種針對 Cocos Creator 專案可行的熱更新方案,不過我們將在 Cocos2d-x 的未來版本中開放 Downloader 的 JavaScript 介面,屆時使用者可以自由開發自己的熱更新方案。

在開始詳細講解之前,開發者可以看一下 Cocos Creator 釋出原生版本後的目錄結構,這個目錄結構和 Cocos2d-x JS 專案的目錄是完全一致的。以前沒有接觸過 Cocos2d-x 的使用者可以參考專案結構文件68。對於 Cocos Creator 來說,所有 JS 指令碼將會打包到 src 目錄中,其他 Assets 資源將會被匯出到 res 目錄。

基於這樣的專案結構,本篇教程中的熱更新思路很簡單:

[list=1][li]基於原生打包目錄中的 res 和 src 目錄生成本地 Manifest 檔案。[/li][li]建立一個熱更新元件來負責熱更新邏輯。[/li][li]遊戲釋出後,若需要更新版本,則生成一套遠端版本資源,包含 res 目錄、src 目錄和 Manifest 檔案,將遠端版本部署到服務端。[/li][li]當熱更新元件檢測到服務端 Manifest 版本不一致時,就會開始熱更新[/li][/list]
教程所使用的範例工程是基於 21 點範例修改而來的,為了展示熱更新的過程,將工程中的 table 場景(牌桌場景)刪除,設為 1.0.0 版本。並在 remote-assets 目錄中儲存帶有 table 場景的完整版本,設為 1.1.0 版本。遊戲開始時會檢查遠端是否有版本更新,如果發現遠端版本則提示使用者更新,更新完成後,使用者重新進入遊戲即可進入牌桌場景。

使用 Version Generator 來生成 Manifest 檔案

在範例工程中,我們提供了一個 version_generator.js 檔案75,這是一個用於生成 Manfiest 檔案的 NodeJS 指令碼。使用方式如下:

命令 : node version_generator.js -v 1.0.0 -u http://your-server-address/tutorial-hot-update/remote-assets/ -s native/package/ -d assets/解釋:http://your-server-address/tutorial-hot-update/remote-assets/ 這個是遠端倉庫的地址,
比如你在A檔案下用命令執行 python -m http.server 8080 設定成遠端伺服器,裡面又有個檔名叫 remote-assets你可以在瀏覽器輸入:http://localhost:8080/remote-assets搭建遠端伺服器 http://blog.csdn.net/u011229456/article/details/77200278native/package/ 這個是打包出來原生版本的相對路徑
比如我的專案路徑是 F:\tanktooles\assets\assets (version_generator 這個生成檔案你需要放在這個路徑下(這些都是建立引擎自帶的F:\tanktooles\assets\assets\library
F:\tanktooles\assets\assets\local
F:\tanktooles\assets\assets\packages
F:\tanktooles\assets\assets\settings
F:\tanktooles\assets\assets\build  這個是生成原生版本才有的
.....我釋出的是windownative/package/ 這個就是等於build/jsb-default (F:\tanktooles\assets\assets\build\jsb-default)也就是生成原生平臺下的res 和src相對於專案的路徑assets/這個是生成出來的檔案,需要拷貝到遠端伺服器上,這個路徑就是本帖說的A檔案目錄下或者A檔案下remote-assets這是我的命令node version_generator.js -v 1.0.0 -u http://192.168.1.123:80/remote-assets/ -s build/jsb-default/ -d remote-assets/

下面是引數說明:

  • -v 指定 Manifest 檔案的主版本號。
  • -u 指定伺服器遠端包的地址,這個地址需要和最初發布版本中 Manifest 檔案的遠端包地址一致,否則無法檢測到更新。
  • -s 本地原生打包版本的目錄相對路徑。
  • -d 儲存 Manifest 檔案的地址。

熱更新元件

除此之外,範例工程中還搭配了一個 Canvas/update 節點用於提示更新和顯示更新進度供參考。

部署遠端伺服器

為了讓遊戲可以檢測到遠端版本,可以在本機上模擬一個遠端伺服器,搭建伺服器的方案多種多樣(比如 Python SimpleHTTPServer18),這裡不做討論,開發者可以使用自己習慣的方式。搭建成功後,訪問遠端包和 Manifest 檔案的地址與範例工程中不同,所以需要修改以下幾個地方來讓遊戲可以成功找到遠端包:

  1. assets/project.manifest:遊戲的本地 Manifest 檔案中的 packageUrlremoteManifestUrlremoteVersionUrl
  2. remote-assets/project.manifest:遠端包的 Manifest 檔案中的 packageUrlremoteManifestUrlremoteVersionUrl
  3. remote-assets/version.manifest:遠端包的 Version 檔案中的 packageUrlremoteManifestUrlremoteVersionUrl

打包原生版本

下載完成範例工程後,可以用 Cocos Creator 直接開啟這個工程。開啟構建釋出面板,構建原生版本,建議使用 Windows / Mac 來測試。

構建成功原生版本之後,開啟原生髮布包的地址,給 main.js 附加上搜索路徑設定的邏輯:

// 在 main.js 的開頭新增如下程式碼
if (cc.sys.isNative) {
    var hotUpdateSearchPaths = cc.sys.localStorage.getItem('HotUpdateSearchPaths');
    if (hotUpdateSearchPaths) {
        jsb.fileUtils.setSearchPaths(JSON.parse(hotUpdateSearchPaths));
    }
}
// 這是為了解決一個重啟的 bug 而新增的
cc.director.startAnimation();

或者直接使用專案倉庫根目錄下的 main.js 覆蓋原生打包資料夾內的 main.js。注意,每次使用 Cocos Creator 構建後,都需要重新修改 main.js

這一步是必須要做的原因是,熱更新的本質是用遠端下載的檔案取代原始遊戲包中的檔案。Cocos2d-x 的搜尋路徑恰好滿足這個需求,它可以用來指定遠端包的下載地址作為預設的搜尋路徑,這樣遊戲執行過程中就會使用下載好的遠端版本。另外,這裡搜尋路徑是在上一次更新的過程中使用 cc.sys.localStorage(它符合 WEB 標準的 Local Storage API9)固化儲存在使用者機器上,HotUpdateSearchPaths 這個鍵值是在 HotUpdate.js中指定的,儲存和讀取過程使用的名字必須匹配。

此外,開啟工程過程中如果遇到這個警告可以忽略:loader for [.manifest] not exists!

執行範例工程

如果一切正常,此時執行原生版本的範例工程,就會發現檢測到新版本,提示更新,更新之後會自動重啟遊戲,此時可進入 table 場景。