下載在這個時代實在是太平常了,每個人都深刻的理解着下載到底是什么。
這一篇文字只是把下載的代碼分享並介紹,而已。
首先,下載系統擔負着幾個使命。
第一、是保持客戶端版本庫的最新。
第二、是下載要能夠比對並最少下載
第三、是要盡量快一些。
其實我們並沒有寫一個下載系統,因為實在沒有幾行代碼。我們這里介紹的是一個
Http下載並保存緩存,首包從StreamingAssets讀取,加載資源,三個功能在一起的模塊
保持最新
為了解決第一第二的問題,我們要盡量讓下載的資源零散一些。
這樣就可以以文件單位進行下載,本地已經有的文件就不下載。
為了實現這個目標我們得在下載之前就決定一個文件是否要更新,因為下載之后流量已經浪費了。
需要知道一個文件是否應該更新,一種簡單的辦法就是給每個文件提供一個簡單的特征信息,先將特征信息下載,然后決定是否下載整個文件。
去一個大文件的特征信息,這是摘要算法的工作,Hash、CRC32、MD5、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。