美文网首页
[RS] Unity问题记录

[RS] Unity问题记录

作者: _Walker__ | 来源:发表于2021-11-05 17:02 被阅读0次

    环境

    • 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的命令行环境下不会执行

    相关文章

      网友评论

          本文标题:[RS] Unity问题记录

          本文链接:https://www.haomeiwen.com/subject/abljeltx.html