UnityTips:不要在发布版本中实现OnGUI方法

0x00 问题

搜索小说 https://198200.com

不知道大家是否在调试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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值