標籤:style blog http color 使用 檔案 for 2014
下載在這個時代實在是太平常了,每個人都深刻的理解著下載到底是什麼。
這一篇文字只是把下載的代碼分享並介紹,而已。
首先,下載系統擔負著幾個使命。
第一、是保持用戶端版本庫的最新。
第二、是下載要能夠比對並最少下載
第三、是要盡量快一些。
其實我們並沒有寫一個下載系統,因為實在沒有幾行代碼。我們這裡介紹的是一個
Http下載並儲存緩衝,首包從StreamingAssets讀取,載入資源,三個功能在一起的模組
源碼位置https://github.com/lightszero/easydown
保持最新
為瞭解決第一第二的問題,我們要盡量讓下載的資源零散一些。
這樣就可以以檔案單位進行下載,本地已經有的檔案就不下載。
為了實現這個目標我們得在下載之前就決定一個檔案是否要更新,因為下載之後流量已經浪費了。
需要知道一個檔案是否應該更新,一種簡單的辦法就是給每個檔案提供一個簡單的特徵資訊,先將特徵資訊下載,然後決定是否下載整個檔案。
去一個大檔案的特徵資訊,這是摘要演算法的工作,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。