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

下載在這個時代實在是太日常了,每一個人都深入的理解着下載究竟是什麼。git

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

 

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

第1、是保持客戶端版本庫的最新。緩存

第2、是下載要可以比對並最少下載服務器

第3、是要儘可能快一些。網絡

 

其實咱們並無寫一個下載系統,由於實在沒有幾行代碼。咱們這裏介紹的是一個併發

Http下載並保存緩存,首包從StreamingAssets讀取,加載資源,三個功能在一塊兒的模塊函數

源碼位置https://github.com/lightszero/easydown工具

保持最新

爲了解決第一第二的問題,咱們要儘可能讓下載的資源零散一些。測試

這樣就能夠以文件單位進行下載,本地已經有的文件就不下載。

爲了實現這個目標咱們得在下載以前就決定一個文件是否要更新,由於下載以後流量已經浪費了。

須要知道一個文件是否應該更新,一種簡單的辦法就是給每一個文件提供一個簡單的特徵信息,先將特徵信息下載,而後決定是否下載整個文件。

去一個大文件的特徵信息,這是摘要算法的工做,Hash、CRC3二、MD五、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。

相關文章
相關標籤/搜索