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

UnityTips:不要在发布版本中实现OnGUI方法的更多相关文章

  1. spring cloud:Edgware.RELEASE版本中zuul回退方法的变化

    Edgware.RELEASE以前的版本中,zuul网关中有一个ZuulFallbackProvider接口,代码如下: public interface ZuulFallbackProvider { ...

  2. Gradle入门(5):创建二进制发布版本

    在创建了一个实用的应用程序之后,我们可能想将其与他人分享.其中一种方式就是创建一个可以从网站上下载的二进制文件. 这篇教程描述了如何创建一个二进制发布版本,满足以下需求: 二进制发布一定不能使用所谓的 ...

  3. pathinfo()在php不同版本中对于对多字节字符处理的不同结果

    phpinfo()函数在处理路径时,在php的低版本中无法处理多字节字符,这里测试的是php5.3和php5.6 的区别 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

  4. 尝新体验ASP.NET Core 6预览版本中发布的最小Web API(minimal APIS)新特性

    本文首发于<尝新体验ASP.NET Core 6预览版本中发布的最小Web API(minimal APIS)新特性> 概述 .NET开发者们大家好,我是Rector. 几天前(美国时间2 ...

  5. [译] OpenStack Kilo 版本中 Neutron 的新变化

    OpenStack Kilo 版本,OpenStack 这个开源项目的第11个版本,已经于2015年4月正式发布了.现在是个合适的时间来看看这个版本中Neutron到底发生了哪些变化了,以及引入了哪些 ...

  6. OpenGL2.0及以上版本中glm,glut,glew,glfw,mesa等部件的关系

    OpenGL2.0及以上版本中gl,glut,glew,glfw,mesa等部件的关系 一.OpenGL OpenGL函数库相关的API有核心库(gl),实用库(glu),辅助库(aux).实用工具库 ...

  7. 软件发布版本区别介绍-Alpha,Beta,RC,Release

    Alpha: Alpha是内部测试版,一般不向外部发布,会有很多Bug.除非你也是测试人员,否则不建议使用. 是希腊字母的第一位,表示最初级的版本 alpha就是α,beta就是β alpha版就是比 ...

  8. 如何使用XE2及更高版本中提供的自定义皮肤(样式)功能

    源:如何使用XE2及更高版本中提供的自定义皮肤(样式)功能 1. 制作样式文件: 点击 XE2+ 的 IDE 菜单上的 Tools-->Bitmap Style Designer, 打开设计器. ...

  9. C#各个版本中的新增特性详解

    序言 自从2000年初期发布以来,c#编程语言不断的得到改进,使我们能够更加清晰的编写代码,也更加容易维护我们的代码,增强的功能已经从1.0搞到啦7.0甚至7.1,每一次改过都伴随着.NET Fram ...

随机推荐

  1. 输入n个学生,并且输入成绩,判断是否偏科

    H学校的领导主任决定分析一下今年所有N名学生的考试成绩,从中找出偏科的学生,考试成绩包含语文,数学,英语三门课程的分数,已知偏科的定义是:某一门课程的分数大于等于90,并且另外两门的分数小于等于70. ...

  2. echarts圆饼图设置默认选中项并在中间显示文字

    效果: 代码: var myChart = echarts.init(document.getElementById('quanshi-echarts-two')); option = { grid: ...

  3. NPOI读取Excel的数据

    首先是给项目安装NPOI.DLL :Install-Package NPOI -Version 2.4.1 HttpPostedFile upLoadPostFile = FileUpload1.Po ...

  4. numpy基本知识

    """np.arrayobject 数组或嵌套的数列dtype 数组元素的数据类型,可选copy 对象是否需要复制,可选order 创建数组的样式,C为行方向,F为列方向 ...

  5. python 黏包现象

    一.黏包 1.tcp有黏包现象 表现两种情况 发送的数据过小且下面还有一个发送数据,这两个数据会一起发送 发送的数据过大,超过最大缓存空间,超出的部分在下一次发送的时候发送 原因: tcp是面向流的, ...

  6. get_字段_display()

    gender_choices = ((1, '男'), (2, '女')) gender = models.IntegerField(verbose_name='性别', choices=gender ...

  7. Mklink 转移文件/文件夹

    使用Mklink可以创建一个目录链接,从而完美转移文件/文件夹 MS官方文档 https://docs.microsoft.com/en-us/windows-server/administratio ...

  8. 基于swoole+Redis的消息实时推送通知

    swoole+Redis将实时数据的推送 一 实现功能 设计师订单如果设计师未抢单,超时(5分钟)设计订单时时给设计师派送, 设计师公众号中收到派单信息 设计发布者收到派单成功信息 环境 centos ...

  9. DFS(深度优先搜索遍历有向图)-03-有向图-太平洋大西洋水流问题

    给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度.“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界. 规定水流只能按照上.下.左.右四个方向流动,且只能从高 ...

  10. Spring AnnotationConfigApplicationContext

    Spring AnnotationConfigApplicationContext 概述 通常Spring XML文件用来作为ClassPathXmlApplicationContext 的初始化.@ ...