下載在這個時代實在是太平常了,每個人都深刻的理解著下載到底是什麼。
這一篇文字只是把下載的程式碼分享並介紹,而已。
首先,下載系統擔負著幾個使命。
第一、是保持客戶端版本庫的最新。
第二、是下載要能夠比對並最少下載
第三、是要儘量快一些。
其實我們並沒有寫一個下載系統,因為實在沒有幾行程式碼。我們這裡介紹的是一個
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。