下載在這個時代實在是太日常了,每一個人都深入的理解着下載究竟是什麼。git
這一篇文字只是把下載的代碼分享並介紹,而已。github
首先,下載系統擔負着幾個使命。算法
第1、是保持客戶端版本庫的最新。緩存
第2、是下載要可以比對並最少下載服務器
第3、是要儘可能快一些。網絡
其實咱們並無寫一個下載系統,由於實在沒有幾行代碼。咱們這裏介紹的是一個併發
Http下載並保存緩存,首包從StreamingAssets讀取,加載資源,三個功能在一塊兒的模塊函數
爲了解決第一第二的問題,咱們要儘可能讓下載的資源零散一些。測試
這樣就能夠以文件單位進行下載,本地已經有的文件就不下載。
爲了實現這個目標咱們得在下載以前就決定一個文件是否要更新,由於下載以後流量已經浪費了。
須要知道一個文件是否應該更新,一種簡單的辦法就是給每一個文件提供一個簡單的特徵信息,先將特徵信息下載,而後決定是否下載整個文件。
去一個大文件的特徵信息,這是摘要算法的工做,Hash、CRC3二、MD五、Sha1,咱們這裏選擇最優秀的Sha1算法來作咱們文件的特徵信息。
首先咱們得爲咱們打算下載的文件生成特徵信息,這些測試文件和工具源碼你均可以從GITHUB上下載到。
點擊檢查,會顯示出如上的狀況,告訴你版本和你上次的版本發生了什麼變化。
請勿刪除生成的allver.ver.txt文件,他會記錄總的版本,每次檢查都會基於上一個版本
而後點擊生成版本,會更新全部的版本文件
這裏咱們加了個group的設計
版本生成工具會把本身路徑下的文件夾做爲group
在客戶端下載時是以group爲單位的,方便處理
好比我能夠 把高分辨率資源和低分辨率資源分別放在兩個group裏
只要客戶端簡單的切換group名字,就能夠實現資源切換。
好比這裏就生成了兩個Group,每一個Group有本身的Ver文件
咱們看看Ver文件
文件名,中間怪怪的就是sha1特徵串,哪怕文件只改了一個字節,生成的特徵串就會不同。最後是文件尺寸,這樣咱們只要取得了ver文件,下載以前就知道文件有多大了。
這樣咱們就有了讓文件版本保持最新的機制了
只要先下載ver文件,而後再判斷每一個group的文件有沒有變化,有變化的有多少,而後下載他們。
把這些測試文件找個Http服務器放上去,而後咱們繼續
客戶端如何下載?直接看代碼說明
先一行代碼初始化資源管理系統
第一個參數是下載服務器地址,就是對應allver.ver.txt文件的http地址
第二個參數是一個回調函數,因爲初始化資源系統會去網絡下載ver文件,須要時間,因此是用回調函數來通知的
第三個參數是一個List<string>,用來告知資源管理器,要檢查哪幾個Group。
你也許會疑問,怎麼會有不檢查的Group呢?好比咱們的遊戲要作好幾個平臺,有一些平臺不通用的資源,咱們把他們放在不一樣平臺,這樣在一個平臺就不會去檢查別的平臺的資源。
注意Resmgr須要一直Update,由於不論是下載仍是加載都不是當即完成的,Resmgr要一直監控狀況
利用宏你就能夠取到每一個平臺一個特殊的字符串,把他們混到group名字,就能夠自動選取平臺專用group下載了
還有第四個默認參數:併發下載數,默認1,要想充分利用下載帶寬,你能夠改爲2,改更多的併發意義並不大,3併發和2併發效果不會有很大差別。
taskState是資源管理器提供的一個簡單統計工具,用來獲得有幾個任務在執行,完成了幾個。
GetNeedDownloadRes 就是比對出那些須要下載的資源
而後循環,下載,下載每一個資源均可以提供一個獨立的通知回調,但咱們這裏演示的是一個開始批量下載的用法,就不單獨處理了。
最後WaitForTaskFinish函數,會一直等到全部任務完成再回調給咱們,
這就完成了整個下載過程
關於下載進度,咱們能夠利用taskState作簡單的文件數量統計,也能夠把downlist裏面的每一個文件的長度取出來本身計算。
演示個簡單的
注意Resmgr須要一直Update,由於不論是下載仍是加載都不是當即完成的,Resmgr要一直監控狀況
不管文件是本地最新仍是剛剛下載完,不管是首包資源仍是更新資源,咱們的加載方式都是同樣的
從Resmgr的 verLocal,本地版本管理 中取得對應的Group,而後從Group中取出File,而後調用File的BeginLoadXXX方法便可
咱們提供了四種Load接口,其實一種Bytes就夠了,其餘資源所有都從Bytes中來,這個咱們在加載篇中講過。
可是考慮到經常使用性,咱們對String Texture2D AssetBundle統一做了封裝。
還有如下其餘的資源是符合加載的,須要多個文件聯合才能加載出來,咱們把這種文件放到加載篇裏去研究。
好了,你如今已經擁有熱更新最重要的更新模塊了,並且他徹底For Free。