zoukankan      html  css  js  c++  java
  • UnityTips:不要在发布版本中实现OnGUI方法

    0x00 问题

    不知道大家是否在调试Unity应用性能的时候发现过一条常见的Marker:UIEvents.IMGUIRenderOverlays。

    很多情况下,这条叫做UIEvents.IMGUIRenderOverlays的Marker下会有持续的GC内存分配以及CPU时间的开销。如下图所示:


    可以看到在这个截图中,UIEvents.IMGUIRenderOverlays的GC分配为368B,时间开销为0.27ms,并且是每帧持续如此的输出。

    0x01 原因

    一旦发现UIEvents.IMGUIRenderOverlays中花费了大量的主线程CPU时间以及GC分配,这就表明在项目的代码库中的某处使用了Unity的即时模式GUI系统:即便是在代码库中仅出现一次OnGUI方法,也会导致IMGUI系统在游戏运行时进行初始化和处理。
    重要的是IMGUI非常低效,不适合生产代码。

    void OnGUI() { if(GUI.Button(new Rect(100, 100, 100, 100), "Load UI")) { //TODO } }
    

      

    检查一下我们的项目,果然在一个测试脚本中发现了一个OnGUI方法的实现。Ok,现在我们把OnGUI方法注释掉再来看一看Unity Profiler提供的数据。


    可以发现,去掉了OnGUI方法之后,UIEvents.IMGUIRenderOverlays的开销从之前的每帧GC分配368B降到了0B,CPU的时间开销从0.27ms降到了0.01ms。
    如果点开UIEvents.IMGUIRenderOverlays的内容,可以看到一个叫做GUI.Repaint的Marker,这个Marker所对应的Unity的底层方法会收集所有实现了OnGUI方法的脚本,对这个OnGUI方法的实现进行绘制。

    可以看到,针对OnGUI的使用不仅仅不易于维护代码的可读性,甚至是可能会引起不必要的开销,哪怕只有一个OnGUI的实现不小心随发布版本一同发布都会带来这种开销。

    因此一个小建议是,大家可以在项目的代码库中搜索OnGUI方法并手动删除它们,或通过使用合适的#if预处理语句将它们包起来,以确保将它们从发布构建中移除。

    https://docs.microsoft.com/zh-cn/learn/?WT.mc_id=DT-MVP-5001664

  • 相关阅读:
    Jenkins 完成安装环境配置
    Jenkins中文社区的所有镜像地址
    VueX源码分析(3)
    VueX源码分析(2)
    VueX源码分析(1)
    Element表单验证(2)
    Element表单验证(1)
    配置淘宝镜像,不使用怪异的cnpm
    React动态import()
    cnpm 莫名奇妙bug 莫名奇妙的痛
  • 原文地址:https://www.cnblogs.com/murongxiaopifu/p/12341204.html
Copyright © 2011-2022 走看看