環(huán)境
- Unity 2020.3.2f1
記錄
1、發(fā)布APK后,場景霧效丟失

Unity默認設置是Automatic:引擎自己剔除一些Shader變體。
我這里的霧效就被剔除了,將Mode改為Custom,勾上需要的模式可解決。
不清楚用了哪種模式,就打開場景,點Input From Current Scene。
2、Editor下Mono內存爆炸

觸發(fā)操作如下:
- 打開Animator編輯窗口(里面顯示動畫狀態(tài)機)
- Hierarchy里選中一個粒子節(jié)點,有Particle System組件即可
我這邊測試時,每兩幀會有84K的內存分配,下班掛了一宿直接系統(tǒng)內存耗盡重啟?。?/p>



經過一天的反編看代碼+內存分析,最終基本確定:
C#到C++傳遞委托導致的內存泄露,委托對象是WindowFunction
內存分析的工具是 Heap Explorer,實際用下來感覺比Unity自己的Memory Profiler要好用一些
解決
底層問題,沒啥解決方案,只能給Unity提Bug了。
測試了下2018正常,2020(2020.3.21f1)、2021(2021.2.0f1)兩個大版本全淪陷。
3、InitializeOnLoad加載不到ScriptableObject配置
??我們項目里,重新導入項目或切分支后(偶現(xiàn)),會出現(xiàn)加載不到AB包配置的問題。配置是一個ScriptableObject的Asset,并且在InitializeOnLoad的時候進行加載,保證每次運行使用的都是最新的。
背景知識
新工程 (無Library) Unity資源、代碼導入流程[流程來源于Editor.log]:
- Refreshing native plugins compatible for Editor
Native插件的編譯- Begin MonoManager ReloadAssembly
重新加載Unity內部的程序集- Application.AssetDatabase Initial Script Refresh Start
將代碼、程序集做完資源導入- [ScriptCompilation] Recompiling all scripts
重新編譯所有代碼- 執(zhí)行InitializeOnLoad標記的代碼
- Application.AssetDatabase Initial Script Refresh End
- Application.AssetDatabase.Refresh Start
導入各種Unity資源- Application.AssetDatabase.Refresh End
- 執(zhí)行(batchmode)命令行調用的方法
??從上面的流程可以看出,項目第一次導入一定會出問題,因為Unity是先執(zhí)行InitializeOnLoad,然后才去導入資源。
解決方案
??我們只需要在正常Editor運行的時候,才用InitializeOnLoad加載Asset,因此可以通過 EditorApplication.delayCall 延遲執(zhí)行來規(guī)避順序問題
EditorApplication.delayCall在batchmode的命令行環(huán)境下不會執(zhí)行
4、Editor下使用模擬模式加載資源,即使有預加載也會出現(xiàn)卡頓
原因
??使用AssetDatabase.Load加載Prefab,它依賴的Texture等資源,是在第一次渲染的時候才會加載進內存。所以,預加載幾乎無效!??!