【微信小游戲】文件系統,遠程加載資源打破4M限制


一、前提

微信小游戲,對游戲包體的大小有嚴格是限制,上傳文件大小<4M,但是本地緩存文件有50M空間,也就是說我們可以將一些資源放到網上,然后緩存到本地。

二、官方概念

文件系統

文件系統是小程序提供的一套以小程序和用戶維度隔離的存儲以及一套相應的管理接口。通過 wx.getFileSystemManager() 可以獲取到全局唯一的文件系統管理器,所有文件系統的管理操作通過 FileSystemManager 來調用。

文件主要分為兩大類:

  • 代碼包文件:代碼包文件指的是在項目目錄中添加的文件。
  • 本地文件:通過調用接口本地產生,或通過網絡下載下來,存儲到本地的文件。

其中本地文件又分為三種:

  1. 本地臨時文件:臨時產生,隨時會被回收的文件。不限制存儲大小。
  2. 本地緩存文件:小程序通過接口把本地臨時文件緩存后產生的文件,不能自定義目錄和文件名。除非用戶主動刪除小程序,否則不會被刪除。跟本地用戶文件共計最多可存儲 50MB 文件。
  3. 本地用戶文件:小程序通過接口把本地臨時文件緩存后產生的文件,允許自定義目錄和文件名。除非用戶主動刪除小程序,否則不會被刪除。跟本地用戶文件共計最多可存儲 50MB 文件。

代碼包文件

由於代碼包文件大小限制,代碼包文件適用於放置首次加載時需要的文件,對於內容較大或需要動態替換的文件,不推薦用添加到代碼包中,推薦在小游戲啟動之后再用下載接口下載到本地。

訪問代碼包文件

代碼包文件的訪問方式是從項目根目錄開始寫文件路徑,不支持相對路徑的寫法。 

修改代碼包文件

代碼包內的文件無法在運行后動態修改或刪除,修改代碼包文件需要重新發布版本

本地文件

本地文件指的是小程序被用戶添加到手機后,會有一塊獨立的文件存儲區域,以用戶維度隔離。即同一台手機,每個微信用戶不能訪問到其他登錄用戶的文件,同一個用戶不同 appId 之間的文件也不能互相訪問。 

本地文件的文件路徑均為以下格式:

{{協議名}}://文件路徑 

其中,協議名在 iOS/Android 客戶端為 "wxfile",在開發者工具上為 "http",開發者無需關注這個差異,也不應在代碼中去硬編碼完整文件路徑。

本地臨時文件

本地臨時文件只能通過調用特定接口產生,不能直接寫入內容。本地臨時文件產生后,僅在當前生命周期內有效,重啟之后即不可用。因此,不可把本地臨時文件路徑存儲起來下次使用。如果需要下次在使用,可通過 FileSystemManager.saveFile() 或 FileSystemManager.copyFile() 接口把本地臨時文件轉換成本地緩存文件或本地用戶文件。

示例
wx.chooseImage({
  success: function (res) { var tempFilePaths = res.tempFilePaths // tempFilePaths 的每一項是一個本地臨時文件路徑 } }) 

本地緩存文件

本地緩存文件只能通過調用特定接口產生,不能直接寫入內容。本地緩存文件產生后,重啟之后仍可用。本地緩存文件只能通過 FileSystemManager.saveFile() 接口將本地臨時文件保存獲得。

示例
fs.saveFile({
  tempFilePath: '', // 傳入一個本地臨時文件路徑 success(res) { console.log(res.savedFilePath) // res.savedFilePath 為一個本地緩存文件路徑 } }) 

注意:本地緩存文件是最初的設計,1.7.0 版本開始,提供了功能更完整的本地用戶文件,可以完全覆蓋本地緩存文件的功能,如果不需要兼容低於 1.7.0 版本,可以不使用本地緩存文件。

本地用戶文件

本地用戶文件是從 1.7.0 版本開始新增的概念。我們提供了一個用戶文件目錄給開發者,開發者對這個目錄有完全自由的讀寫權限。通過 wx.env.USER_DATA_PATH 可以獲取到這個目錄的路徑。

示例
// 在本地用戶文件目錄下創建一個文件 a.txt,寫入內容 "hello, world" const fs = wx.getFileSystemManager() fs.writeFileSync(`${wx.env.USER_DATA_PATH}/hello.txt`, 'hello, world', 'utf8')

三、Cocos Creator 介紹

小游戲環境的資源管理

在小游戲環境中,資源管理是最特殊的部分,它和瀏覽器的不同在於下面四點:

  1. 小游戲的包內體積不能夠超過 4mb,包含所有代碼和資源,額外的資源必須通過網絡請求下載。
  2. 對於從遠程服務器下載的文件,小游戲環境沒有瀏覽器的緩存以及過期更新機制。
  3. 對於小游戲包內資源,小游戲環境內並不是按需加載的,而是一次性加載所有包內資源,然后再啟動頁面。
  4. 不可以從遠程服務器下載腳本文件。

這里引出了兩個關鍵的問題,首頁面加載速度和遠程資源緩存及版本管理。對於首頁面加載速度,我們建議用戶只保存腳本文件在小游戲包內,其他資源都從遠程服務器下載。而遠程資源的下載、緩存和版本管理,其實在 Cocos Creator 中,已經幫用戶做好了。下面我就來解釋一下這部分的邏輯。

在小游戲環境中,我們提供了一個 wxDownloader 對象,給它設置了 REMOTE_SERVER_ROOT 屬性后,引擎下載資源的邏輯就變成:

  1. 檢查資源是否在小游戲包內
  2. 不存在則查詢本地緩存資源
  3. 如果沒有緩存就從遠程服務器下載
  4. 下載后保存到小游戲應用緩存內供再次訪問時使用

同時,當開啟引擎的 md5Cache 功能后,文件的 url 會隨着文件內容的改變而改變,這樣當游戲發布新版本后,舊版本的資源在緩存中就自然失效了,只能從服務器請求新的資源,也就達到了版本控制的效果。

具體來說,開發者需要做的是:

  1. 構建時,勾選 md5Cache 功能。
  2. 將小游戲發布包中的 res 文件夾完整的上傳到服務器。
  3. 刪除發布包內的 res 文件夾。
  4. 在構建發布面板中設置 遠程服務地址
  5. 對於測試階段來說,可能你無法部署到正式服務器上,需要用本地服務器來測試,那么請在微信開發者工具中打開詳情頁面,勾選項目設置中的 不檢驗安全域名、TLS 版本以及 HTTPS 證書 選項。

四、實戰

1、cocos creator  構建發布中設置【遠程服務器地址】。並且選中MD5 Cache。

2、本地配置好的可訪問路徑。

 

3、將構建出來的res整體替換站點res。並且刪掉構建出來的res。

 

五、總結

1、Error 4916, please go to https://github.com/cocos-creator/engine/blob/master/EngineErrorMap.md#491613 to see details. Arguments: 4aGsrZzohDNKpivyOlzMee;這錯誤一般是路徑錯誤引起的,可以去微信開發者工具 libs/wx-downloader.js 中打印查看並解決。

2、不能熱更新代碼文件,修改JS必須重新提交審核,也許你會想直接把js放到resource目錄下跟圖片等資源一起更新,是不允許的,生成版本時js會自動的合並到項目的js文件中。

3、更多問題,歡迎加QQ群交流:418177552


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM