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


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

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

 

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

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

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

第三、是要盡量快一些。

 

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

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。


免責聲明!

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



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