[RS] Unity问题记录

环境

  • Unity 2020.3.2f1

记录

1、发布APK后,场景雾效丢失

Project Graphics Settings

Unity默认设置是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]:

  1. Refreshing native plugins compatible for Editor
    Native插件的编译
  2. Begin MonoManager ReloadAssembly
    重新加载Unity内部的程序集
  3. Application.AssetDatabase Initial Script Refresh Start
    将代码、程序集做完资源导入
  4. [ScriptCompilation] Recompiling all scripts
    重新编译所有代码
  5. 执行InitializeOnLoad标记的代码
  6. Application.AssetDatabase Initial Script Refresh End
  7. Application.AssetDatabase.Refresh Start
    导入各种Unity资源
  8. Application.AssetDatabase.Refresh End
  9. 执行(batchmode)命令行调用的方法

  从上面的流程可以看出,项目第一次导入一定会出问题,因为Unity是先执行InitializeOnLoad,然后才去导入资源。

解决方案

  我们只需要在正常Editor运行的时候,才用InitializeOnLoad加载Asset,因此可以通过 EditorApplication.delayCall 延迟执行来规避顺序问题

EditorApplication.delayCall 在batchmode的命令行环境下不会执行


4、Editor下使用模拟模式加载资源,即使有预加载也会出现卡顿

原因

  使用AssetDatabase.Load加载Prefab,它依赖的Texture等资源,是在第一次渲染的时候才会加载进内存。所以,预加载几乎无效!!!


你可能感兴趣的:([RS] Unity问题记录)