环境
- Unity 2020.3.2f1
记录
1、发布APK后,场景雾效丢失
Project Graphics SettingsUnity默认设置是Automatic:引擎自己剔除一些Shader变体。
我这里的雾效就被剔除了,将Mode改为Custom,勾上需要的模式可解决。
不清楚用了哪种模式,就打开场景,点Input From Current Scene
。
2、Editor下Mono内存爆炸
Mono占用触发操作如下:
- 打开Animator编辑窗口(里面显示动画状态机)
- Hierarchy里选中一个粒子节点,有Particle System组件即可
我这边测试时,每两帧会有84K的内存分配,下班挂了一宿直接系统内存耗尽重启!!
Crash Log 内存分析1 内存分析2经过一天的反编看代码+内存分析,最终基本确定:
C#到C++传递委托导致的内存泄露,委托对象是WindowFunction
内存分析的工具是 Heap Explorer,实际用下来感觉比Unity自己的Memory Profiler要好用一些
解决
底层问题,没啥解决方案,只能给Unity提Bug了。
测试了下2018正常,2020(2020.3.21f1)、2021(2021.2.0f1)两个大版本全沦陷。
3、InitializeOnLoad
加载不到ScriptableObject配置
我们项目里,重新导入项目或切分支后(偶现),会出现加载不到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
重新编译所有代码- 执行InitializeOnLoad标记的代码
- Application.AssetDatabase Initial Script Refresh End
- Application.AssetDatabase.Refresh Start
导入各种Unity资源- Application.AssetDatabase.Refresh End
- 执行(batchmode)命令行调用的方法
从上面的流程可以看出,项目第一次导入一定会出问题,因为Unity是先执行InitializeOnLoad,然后才去导入资源。
解决方案
我们只需要在正常Editor运行的时候,才用InitializeOnLoad加载Asset,因此可以通过 EditorApplication.delayCall
延迟执行来规避顺序问题
EditorApplication.delayCall
在batchmode的命令行环境下不会执行
网友评论