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. Go语言教程之结构体

    Hello,大家好,我是小栈君,最近因为工作的事情延误了一点分享的进度,但是我会尽量抽时间分享关于IT干货知识,还希望大家能够持续关注"IT干货栈"哦. 闲话不多说,今天给大家继续 ...

  2. 简单工厂模式(C++)

    #include <iostream> using namespace std; class Fruit { public : ; }; class Banana :public Frui ...

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

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

  4. vue 移动端在div上绑定click事件 失效

    在.vue的文件中使用了better-scroll,在div标签上绑定click事件后,无效. 原因:使用了better-scroll,默认它会阻止touch事件.所以在配置中需要加上click: t ...

  5. windows创建git并连结github

    1.下载跟自己系统相对应的git版本 2.默认安装 3.绑定用户 git config --global user.name ""git config --global user. ...

  6. 用python搭一个超简易的文件服务器

    这个文件服务器纯粹是在学习python cgi编程时,顺便玩玩而已,因为搭文件服务器的话完全可以linux,简单方便,这里就是随便玩玩,功能也就是只能下载文件 1.登录页面,做个简单验证 新建一个ht ...

  7. 到头来还是逃不开Java - Java13程序基础

    java程序基础 没有特殊说明,我的所有学习笔记都是从廖老师那里摘抄过来的,侵删 引言 兜兜转转到了大四,学过了C,C++,C#,Java,Python,学一门丢一门,到了最后还是要把Java捡起来. ...

  8. ArcGIS10.2安装教程

    1,首先要下载Arcgis 10.2软件,很大大约有2个多G.下载后分别全部解压. 2,首先,安装相应的LicenseManager,双击Arcgis 10.2打开安装界面,选择安装. 3,开始安装L ...

  9. vue3的打包及打包的坑

    1.vue3没有vue.config.js文件,在根目录下建一个vue.config.js文件 2.vue.config.js  3.vue3.3版本前的打包命令  vue3.3版本之后 我用3.3之 ...

  10. ffplay的使用

    https://www.cnblogs.com/renhui/p/8458802.html