Unity3D熱更新全書-下載 唯一的一篇

瘋光無線發表於2014-08-09

下載在這個時代實在是太平常了,每個人都深刻的理解著下載到底是什麼。

這一篇文字只是把下載的程式碼分享並介紹,而已。

 

首先,下載系統擔負著幾個使命。

第一、是保持客戶端版本庫的最新。

第二、是下載要能夠比對並最少下載

第三、是要儘量快一些。

 

其實我們並沒有寫一個下載系統,因為實在沒有幾行程式碼。我們這裡介紹的是一個

Http下載並儲存快取,首包從StreamingAssets讀取,載入資源,三個功能在一起的模組

原始碼位置https://github.com/lightszero/easydown

保持最新

為了解決第一第二的問題,我們要儘量讓下載的資源零散一些。

這樣就可以以檔案單位進行下載,本地已經有的檔案就不下載。

為了實現這個目標我們得在下載之前就決定一個檔案是否要更新,因為下載之後流量已經浪費了。

需要知道一個檔案是否應該更新,一種簡單的辦法就是給每個檔案提供一個簡單的特徵資訊,先將特徵資訊下載,然後決定是否下載整個檔案。

去一個大檔案的特徵資訊,這是摘要演算法的工作,Hash、CRC32、MD5、Sha1,我們這裡選擇最優秀的Sha1演算法來做我們檔案的特徵資訊。

image

首先我們得為我們打算下載的檔案生成特徵資訊,這些測試檔案和工具原始碼你都可以從GITHUB上下載到。

點選檢查,會顯示出如上的情況,告訴你版本和你上次的版本發生了什麼變化。

請勿刪除生成的allver.ver.txt檔案,他會記錄總的版本,每次檢查都會基於上一個版本

然後點選生成版本,會更新所有的版本檔案

 

這裡我們加了個group的設計

版本生成工具會把自己路徑下的資料夾作為group

在客戶端下載時是以group為單位的,方便處理

比如我可以 把高解析度資源和低解析度資源分別放在兩個group裡

只要客戶端簡單的切換group名字,就可以實現資源切換。

 

image比如這裡就生成了兩個Group,每個Group有自己的Ver檔案

 

image

我們看看Ver檔案

檔名,中間怪怪的就是sha1特徵串,哪怕檔案只改了一個位元組,生成的特徵串就會不一樣。最後是檔案尺寸,這樣我們只要取得了ver檔案,下載之前就知道檔案有多大了。

這樣我們就有了讓檔案版本保持最新的機制了

只要先下載ver檔案,然後再判斷每個group的檔案有沒有變化,有變化的有多少,然後下載他們。

把這些測試檔案找個Http伺服器放上去,然後我們繼續

image

客戶端下載

客戶端如何下載?直接看程式碼說明

image

先一行程式碼初始化資源管理系統

第一個引數是下載伺服器地址,就是對應allver.ver.txt檔案的http地址

第二個引數是一個回撥函式,由於初始化資源系統會去網路下載ver檔案,需要時間,所以是用回撥函式來通知的

第三個引數是一個List<string>,用來告知資源管理器,要檢查哪幾個Group。

你也許會疑問,怎麼會有不檢查的Group呢?比如我們的遊戲要做好幾個平臺,有一些平臺不通用的資源,我們把他們放在不同平臺,這樣在一個平臺就不會去檢查別的平臺的資源。

注意Resmgr需要一直Update,因為不管是下載還是載入都不是立即完成的,Resmgr要一直監控情況

image利用巨集你就可以取到每個平臺一個特殊的字串,把他們混到group名字,就可以自動選取平臺專用group下載了

還有第四個預設引數:併發下載數,預設1,要想充分利用下載頻寬,你可以改成2,改更多的併發意義並不大,3併發和2併發效果不會有很大差異。

image

taskState是資源管理器提供的一個簡單統計工具,用來得到有幾個任務在執行,完成了幾個。

GetNeedDownloadRes 就是比對出那些需要下載的資源

然後迴圈,下載,下載每個資源都可以提供一個獨立的通知回撥,但我們這裡演示的是一個開始批量下載的用法,就不單獨處理了。

最後WaitForTaskFinish函式,會一直等到所有任務完成再回撥給我們,

這就完成了整個下載過程

下載進度

關於下載進度,我們可以利用taskState做簡單的檔案數量統計,也可以把downlist裡面的每個檔案的長度取出來自己計算。

演示個簡單的

image

注意Resmgr需要一直Update,因為不管是下載還是載入都不是立即完成的,Resmgr要一直監控情況

載入使用

無論檔案是本地最新還是剛剛下載完,無論是首包資源還是更新資源,我們的載入方式都是一樣的

image

從Resmgr的 verLocal,本地版本管理 中取得對應的Group,然後從Group中取出File,然後呼叫File的BeginLoadXXX方法即可

image

我們提供了四種Load介面,其實一種Bytes就夠了,其他資源全部都從Bytes中來,這個我們在載入篇中講過。

但是考慮到常用性,我們對String Texture2D AssetBundle統一作了封裝。

還有以下其他的資源是符合載入的,需要多個檔案聯合才能載入出來,我們把這種檔案放到載入篇裡去研究。

好了,你現在已經擁有熱更新最重要的更新模組了,而且他完全For Free。

相關文章