AssetBundle如何計算可靠的Hash值

1)AssetBundle如何計算可靠的Hash值
2)升級後的物理開銷問題
3)UWA GOT支持iOS後無法出包問題
4)如何釋放Live2D new的Mesh
5)霧效Fog在手機上失效的問題


這是第185篇UWA技術知識分享的推送。今天我們繼續爲大家精選了若干和開發、優化相關的問題,建議閱讀時間10分鐘,認真讀完必有收穫。

UWA 問答社區:answer.uwa4d.com
UWA QQ羣2:793972859(原羣已滿員)


AssetBundle

Q:項目之前是使用建置出來的AssetBundle檔案,自己算MD5當作用戶端更新比對項目。但因爲AssetBundle建置的不穩定性,常常Asset沒有改變但是AssetBundle變了,導致用戶端下載到不必要的AssetBundle。所以後來開始試着從Asset算一個Version Hash值。目前引入的參數有:

  • AssetBundleName
  • 有依賴但不在這個AssetBundleName下的Asset的路徑與其 AssetBundleName
    (跨AssetBundle引用實驗出來是看AssetBundleName,當有依賴的Asset AssetBundleName改變則必須替換AssetBundle否則依賴加載會失效)
  • 所有這個AssetBundleName下Asset檔案的MD5
  • 所有這個AssetBundleName下Asset檔案的.meta的MD5
  • 所有跟這個AssetBundleName下的Sprite共用同一個Atlas,但不在這個AssetBundle的Sprite Asset與其.meta的MD5

但是這個方案實際應用還是有很多問題:

  • Version Hash計算很久(有想過直接重複利用Unity AssetDatabase裏的 Hash128,但是貌似很多人都遇到Hash128也不穩定的問題)
  • AssetBundleName如果在建置時修改則不一定會寫到.meta,造成.meta的檔案MD5是錯的。除非Reimport,但是Reimport就會造成建置時間暴漲(如果是把 AssetBundleName commit進Repo建置時不設定,則有可能有忘記commit的問題)
  • ScriptableObject .asset沒有commit卻在Build machine自行變化,有的時候是 SerializeFile觸發升級Migration(但是升級時間點非常謎,有時候本地用相同版本Reimport All也不升級,在Build machine卻又有升級),有的時候是清單項目順序調換

感覺自己Version Hash好像也沒有完全解決問題又造成建置時間增加,所以想問在運營大項目的大佬們有什麼建議,謝謝。

A1:個人還是投票給構建完畢之後的AssetBundle的Hash值。

一方面擔心自己構建的不能覆蓋所有更改的情況(題主考慮的已經挺全面),另外一方面是.meta文件本身就不是爲構建唯一性設計的,比如它混合了各個平臺的參數,任何一個平臺的參數修改都會導致其內容的更改,因此我們必須參考meta,而它的修改又不一定意味着資源的修改,這樣就很尷尬。

在這個前提下,可以做的事情是儘量發現和解決資源相同但是AssetBundle的文件Hash值卻不同的情況。
感謝賈偉昊@UWA問答社區提供了回答

A2:我們是這樣做的:
AssetBundleHash結合AssetFileHash,在Bundle對應的manifest文件中可以取到AssetFileHash值。

ManifestFileVersion: 0
CRC: 3889896754
Hashes:
  AssetFileHash:
    serializedVersion: 2
    Hash: 7a90127ef724ff63cb40874dc69929b8
  TypeTreeHash:
    serializedVersion: 2
    Hash: 0d46a8251e1e96cd839078edaf4c28a3

對於AssetBundleHash不同但AssetFileHash相同的,按未變化處理。

感謝littlesome@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5dac2d919fabd93d420711f7


Physics

Q:一個項目場景裏只有靜態碰撞盒, 用於玩家點擊選中。Unity 5.6之前,物理開銷基本沒有。 升級到Unity 2018後,分析報告裏的物理開銷2ms不到,雖然不多,但是很奇怪。

後來發現Project Settings裏把Physics.autoSimulation關了之後開銷就下去很多了, Physics2D.autoSimulation關了之後會再下去了一點點。這個參數好像是Unity 2017之後新加的參數。

看介紹,關了這個參數之後每次LateUpdate的時間裏就不會自動處理物理方面的計算, 可以手動調用Physics.Simulate來手動控制物理計算。

A:物理系統不會自己去運行了。在5.4~2017.2版本中,Unity引擎可以根據你們項目中Rigidbody的使用情況來自己決定是否開啓物理引擎,如果沒有使用,則它會自動關閉。但是,在2017.4版本以後,物理引擎會自動開啓,Unity引擎推出API由開發團隊自己去控制是否開啓和關閉。所以,一般在最新的版本中,UWA都建議大家看看你們的物理模塊開銷,是否在自動空轉,如果耗時較高,則可以嘗試自己去關閉Auto Simulation選項。

但是,需要說明的是,如果場景中含有Trigger、布料模擬等,則關閉Auto Simulation後則不起作用了,這個時候研發團隊需要根據自身情況來決定該選項的開啓和關閉。

該回答由UWA提供,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5dc9229f7307ec2f0f99a1bd


SDK

Q:最近有看到UWA GOT工具新增了iOS版本的支持,於是下載了最新的工具包進行了接入測試。是按照文檔直接將UWA_GOTv2.0.1_iOS.unitypackage導入進了Unity項目內,並且做了配置。

但是發現添加了UWA GOT插件以後iOS上不能正常出包,總是卡在xcodebuild archive這一步,報錯信息如下:

** ARCHIVE FAILED **


The following build commands failed:
  Check dependencies

我們打的是Distribution包,是否跟這個有關係?已經確認就是添加了UWA_GOT插件以後引起無法打包的問題,因爲在移除了SDK以後可以順利出包了,麻煩各位前輩幫忙解答下。
(版本:Unity 2018.3.4f1)

A:目前已經解決,是被上面的報錯信息混淆了視聽。

之前因爲打包環境比較複雜,有的時候不能得到真正的報錯位置,而且同時還要不停地有出包任務,不好做調試。所以今天單獨在一臺純淨的Mac上面模擬了打包環境,並接入UWA GOT的iOS版SDK,測試了以後有以下發現:
1、導出xcode工程並且在xcode中直接build不會報錯。
2、導出xode工程,然後在xcode中執行Build Archive會報錯。

報錯信息類似於下面這樣:

ld: bitcode bundle could not be generated because
 '/xx/libuwa.a' was built without full bitcode. All object files and libraries for bitcode must be generated from Xcode Archive or Install build for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

這樣就比較好解決了,原因是如果一個工程裏面有靜態庫的引用,那麼所有的靜態庫也需要打開Bitcode後重新編譯。這一切在直接Build的時候都沒有問題,但是在“Archive”的時候就會報錯。

我們在出iOS包的流程是先Build Archive然後在export Archive導出ipa,因此就會出現問題了。

解決方法比較簡單,我是直接在執行xcodebuild命令的時候把EnableBitcode設置爲NO了,類似於下面的命令:

xcodebuild -target <your target> -configuration <your configuration> **ENABLE_BITCODE=NO**

看網上還有一種解決辦法是不關閉bitcode,然後在執行xcode build命令的時候帶上參數。

OTHER_CFLAGS="-fembed-bitcode"

後面這種沒有試過不知是否奏效,希望可以幫助到大家。

感謝題主馬三小夥兒@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5dd3a6737307ec2f0f99a24f


Loading

Q:項目用的Live2D,創建後其框架會動態new大量Mesh,想求教下除了用Resources.UnloadUnusedAssets()接口外,有沒有方法能指定只釋放這部分Mesh?

A:Live2D有兩個大坑:
(1)CubismRenderer初始化new Mesh2,並沒有銷燬代碼

 

代碼修改如下:

 

(2)MeshRenderer.material實例化獨立材質

 

代碼修改如下,運行時還需要把所有MeshRender的材質設置成同一個材質:

 

感謝晨星@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5dccdbff14ec712eefaf01a6


Rendering

Q:在PC上面,整個場景中有霧效,單獨對這個場景打包AssetBundle,那麼在手機上面沒有霧效。如果是直接將該場景丟在Hierarchy上build,在手機上面可以看見霧效。請教下,這個是哪裏出了問題?都是在同樣的手機上面測試的。

A:可能是graphics裏的霧選項沒勾Shader裁剪了。

 

感謝關@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5dd678c42fb2eb2ef5b5d06b

封面圖來源:Animation Rigging: Advanced Setups
展示了Unity動畫索具包的高級設置和用例。
https://lab.uwa4d.com/lab/5d3cbe3e5b9dec79de32a9e8


今天的分享就到這裏。當然,生有涯而知無涯。在漫漫的開發週期中,您看到的這些問題也許都只是冰山一角,我們早已在UWA問答網站上準備了更多的技術話題等你一起來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官網:www.uwa4d.com
官方技術博客:blog.uwa4d.com
官方問答社區:answer.uwa4d.com
UWA學堂:edu.uwa4d.com
官方技術QQ羣:793972859(原羣已滿員)

發佈了406 篇原創文章 · 獲贊 134 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章