Unity官方公布熱更新方案效能對比淺析
Unity應用的iOS熱更新
作者:丁治宇
Unity TechnologiesChina
Agenda
? 什麼是熱更新
? 為何要熱更新
? 如何在iOS 上對Unity 應用進行熱更新
? 支援Unity iOS 熱更新的各種Lua 外掛程式的對比
什麼是熱更新
? 廣義定義
? 無需關閉伺服器,不停機狀態下修複漏洞,更新資源等,重點是更新邏輯代碼。
? 狹義定義( iOS熱更新)
? 無需將代碼重新打包提交至AppStore,即可更新用戶端的執行代碼,即不用下載app而自動更新程式。
? 現狀
? 蘋果禁止了C#的部分反射操作,禁止JIT(即時編譯,程式運行時建立並運行新代碼),不允許邏輯熱更新,只允許使用AssetBundle進行資源熱更新。
為何要熱更新
? 縮短使用者擷取新版應用的用戶端的流程,改善使用者體驗。
? 具體到iOS平台的應用上,有以下幾個原因
? App Store的審核周期難控制。
? 手機應用程式更新頻繁。
? 對於大型應用,更新成本太大。
? 終極狀態
? 不重新下載、不停機狀態下完全變換一個應用的內容。
如何在iOS 上對Unity 應用進行熱更新
? Android 應用的熱更新
? 將執行代碼先行編譯為assemblydll。
? 將代碼作為TextAsset打包進Assetbundle。
? 運行時,使用Reflection機制實現代碼的功能。
? 更新相應的Assetbundle即可實現熱更新。
? Android 與iOS 熱更新的 異同
? 蘋果官方禁止iOS下的程式熱更新;JIT在iOS下無效。
? 熱更新方案:Unity+Lua外掛程式。
? 使用Lua 外掛程式進行iOS 熱更新的 原理
? Unity 熱更新的注意點
? 需要更新的代碼、資源,都必須打包成AssetBundle(建議使用未壓縮的格式打包)
? 熟悉Unity的幾個重要的路徑
? Resources(唯讀)
? StreamingAssets(唯讀)
? Application.dataPath(唯讀)
? Application.persistentDataPath(可讀寫)
? 重要路徑之 之Resources
? Resources檔案夾下的資源無論使用與否都會被打包
? 資源會被壓縮,轉化成二進位
? 打包後檔案夾下的資源唯讀
? 無法動態更改,無法做熱更新
? 使用Resources.Load載入
? 重要路徑之StreamingAssets
? 流資料的緩衝目錄
? 檔案夾下的資源無論使用與否都會被打包
? 資源不會被壓縮和加密
? 打包後檔案夾下的資源唯讀,主要存放二進位檔案
? 無法做熱更新
? WWW類載入(一般用CreateFromFile ,若資源是AssetBundle,依據其打包方式看是否是壓縮的來決定)
? 相對路徑,具體路徑依賴於實際平台
?Application.streamingAssetsPath
? IOS: Application.dataPath + “/Raw” 或Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw
? 重要路徑之Application.dataPath
? 遊戲的資料檔案夾的路徑(例如在Editor中的Assets)
? 很少用到
? 無法做熱更新
? IOS路徑: Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data
? 重要路徑之Application.persistentDataPath
? 持久化資料存放區目錄的路徑( 沙箱目錄,打包之前不存在 )
? 檔案夾下的資源無論使用與否都會被打包
? 運行時有效,可讀寫
? 無內容限制,從StreamingAsset中讀取二進位檔案或從AssetBundle讀取檔案來寫入PersistentDataPath中
? 適合熱更新
? IOS路徑: Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents
? 使用Lua 外掛程式進行iOS 熱更新的總體流程
支援Unity iOS 熱更新的各種Lua 外掛程式的對比
? uLua(asset store)
? uLua外掛程式原生版本,開山鼻祖
? 不會產生靜態代碼
? 反射機制,效率低下,速度慢,gcalloc頻繁
? 已停止更新維護,不支援Unity5.x,淡出主流
? uLua & cstoLua
? 開發平台成熟穩定,Bug修複迅速
? 開發人員眾多,資源豐富
? 靜態方法,效能優
?有成功商業產品案例(啪啪三國、超神戰隊、酷魚吧捕魚、絕地戰警、這不是刀塔等) 魚、絕地戰警、這不是刀塔等)
? 都是基於原生版本的改進;未來,兩者會合并成一個外掛程式
? sLua
? 靜態方法,效能優
? 核心代碼簡潔
? 資源較少,開發平台不夠成熟穩定
? 無 無成功商業產品案例 成功商業產品案例
? 基於原生版本的改進
支援Unity iOS 熱更新的各種Lua 外掛程式的對比
? C#Light(L#)
? 淡出主流
? uniLua
? c#實現的Lua虛擬機器,非完整方案
? 淡出主流
支援Unity iOS 熱更新的各種Lua 外掛程式的對比
然後就是 uLua 和 sLua的測試代碼。
綜合來看 肯定是 uLua 會更好一些。