有时候会发现 Unity UI 非常耗时,在 Profiler 中可以轻易的看到 UI 中 的 GraphicRaycaster.Raycast 单帧调用可以成百上千,甚至好几千,帧速率前不忍赌,一关掉 UI 立马满血复活。
     这种情况大多出现在一是 Canvas 比较多而且子节点添加 GraphicRaycaster  组件也比较多的情况;二是每个 Canvas 下面有很多个 UI 面板,而每次其实显示的只有那么几个,不用的隐藏 SetActive(false),使用的激活显示 SetActive(true)。
     第一种情况就只能自己根据需求进行简化,不要滥用了 Canvas,优化和精简自己的设计;第二种情况看起来貌似没什么问题,实际上正是帧速率大大下降的元凶。
     说第二种没问题主要是符合 Unity 的使用基本原则,而且大家容易想到的使用方式,那为什么有问题,那要先看看一点相关 UI 的工作模式。每个 Graphic 组件(包括所有继承自 Graphic 的组件)都必须要通过 GraphicRegistry.RegisterGraphicForCanvas 注册到 GraphicRegistry 中,Graphic 中能够引起注册的事件有:OnTransformParentChanged(),OnEnable(),OnCanvasHierarchyChanged();OnEnable() 这个不必说就是组件激活时的回调,其它两个 OnTransformParentChanged(), OnCanvasHierarchyChanged() 理论上应该只在控件可用 Enable 和 Active 的时候才会被调用,或者说才应该产生 GraphicRegistry.RegisterGraphicForCanvas 的注册过程,而现在的代码是只有 OnTransformParentChanged() 在 GraphicRegistry.RegisterGraphicForCanvas 之前检测了 IsActive(),而 OnCanvasHierarchyChanged() 却未做任何检测,即使挂接了 Graphic 的对象在 Unity 的 Inspector 中处于非激活状态,启动游戏后 OnCanvasHierarchyChanged() 依然会被调用,导致该 Graphic 被注册进 GraphicRegistry,并且最终参与了 GraphicRaycaster.Raycast,造成了 CPU 周期的浪费。
     总而言之,这应该是 Unity UI 系统的一个 bug,本来从 BitBucket 上 Fork 了想修改下提交,但是发现无法 clone,很是奇怪,暂时搁置了,既然暂时无法修改源码,官方也没有修改,那么暂时的解决方案就是在启动后,手动清理每个 Canvas 下在 GraphicRegistry 中注册的 Graphic,将所有 IsActive() 为 false 的组件通过 GraphicRegistry.UnregisterGraphicForCanvas 从 GraphicRegistry 中移除即可,达到曲线救国的目的。
 

关于 Unity UI 中 GraphicRaycaster.Raycast 数量巨大的问题的更多相关文章

  1. unity ui中使用onmouseover

    unity ui中鼠标移进或者移出的触发方式与2d.3d的不同,2d.3d物体使用的是onmouseover,ui使用的是OnPointerEnter.需要实现以下两个接口. public class ...

  2. Unity UI性能优化技巧

    本文将介绍一些提升Unity UI性能的技巧.更多优化技巧,可以观看Unity工程师Ian Dundore在Unite Europe 2017的演讲<使用Unity性能提升技巧>. 1.划 ...

  3. Unity优化方向——优化Unity游戏中的图形渲染(译)

    CPU bound:CPU性能边界,是指CPU计算时一直处于占用率很高的情况. GPU bound:GPU性能边界,同样的是指GPU计算时一直处于占用率很高的情况. 原文:https://unity3 ...

  4. i3D的一篇Unity教程中的笔记

    原地址:http://blog.sina.com.cn/s/blog_72b936d80100wwej.html 以下是i3D的一篇Unity教程中的笔记. i3D的这篇教程是[i3D.Next-Ge ...

  5. [译]如何在Unity编辑器中添加你自己的工具

    在这篇教程中你会学习如何扩展你的Unity3D编辑器,以便在你的项目中更好的使用它.你将会学习如何绘制你自己的gizmo,用代码来实现创建和删除物体,创建编辑器窗口,使用组件,并且允许用户撤销他们所作 ...

  6. 关于Unity项目中创建项目遇到的一些问题

    1.Unity调用Android的方法默认不是在UI线程执行,所以在Android上写一些页面的重绘的方法,让Unity去调用时,注意要在Android中添加对应的runOnUiThread才可以: ...

  7. Unity UI 基础【译】

    https://unity3d.com/cn/learn/tutorials/topics/best-practices/fundamentals-unity-ui?playlist=30089 理解 ...

  8. Unity 3D中不得不说的yield协程与消息传递

    1. 协程 在Unity 3D中,我们刚开始写脚本的时候肯定会遇到类似下面这样的需求:每隔3秒发射一个烟花.怪物死亡后20秒再复活之类的.刚开始的时候喜欢把这些东西都塞到Update里面去,就像下面这 ...

  9. Unity UI相关总结

    UIGrid 加载面板时,如果面板中含有大容量的 UIGrid,可能会很卡.我们可以只加载 UIGrid 的前 n 个单元格对象,在显示面板之后,利用协程加载剩余的所有单元格,每帧加载 m 个. 同样 ...

随机推荐

  1. C#基础(五)——类中私有构造函数作用

    如果类成员有private修饰符,就不允许在类范围以外访问这个类成员.对类构造函数应用private修饰符时,则禁止外部类创建该类的实例.尽管看上去有些不好理解(既然不能实例化,那么这个类还有什么用处 ...

  2. discuz 重新定义jquery的$

    最近做个小插件 发现加了这个代码不执行: $.ajax({ url:'plugin.php?id=register:regeist_jiangsu', type:'post', data:{ 'mob ...

  3. org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode

    [spring]:org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowe ...

  4. [转]LoadRunner脚本录制常见问题整理

    LoadRunner脚本录制常见问题整理 1.LoadRunner录制脚本时为什么不弹出IE浏览器? 当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面 ...

  5. Win8.1设置窗口背景颜色为护眼色

    更改注册表 window+R --->输入regedit(点击确定后进入注册表编辑器) 需要修改以下两个地方,重启电脑生效: [HKEY_CURRENT_USER\Control Panel\C ...

  6. 【单片机通信协议】CAN总线基础知识

    CAN总线基础知识(一) 1.1 CAN总线是什么? CAN(Controller Area Network)是ISO国际标准化的串行通信协议.广泛应用于汽车.船舶等.具有已经被大家认可的高性能和可靠 ...

  7. 【一起学OpenFOAM】04 OpenFOAM的学习资源

    OpenFOAM的学习资料并不多,个人猜测也许是与软件的类型有关系. 对于商用软件来讲,由于要占领市场,软件开发商自然是巴不得会用软件的人越多越好,因为他们卖的是软件,会用的人越多,软件卖得越好.他们 ...

  8. 野指针、NULL指针和void*

    一.野指针 “野指针”不是NULL指针,是指向“垃圾”内存的指针. “野指针”的成因主要有三种: (1)指针变量没有被初始化.任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱 ...

  9. XSS高级实战教程

    1.[yueyan科普系列]XSS跨站脚本攻击--yueyan 2.存储型XSS的成因及挖掘方法--pkav 3.跨站脚本攻击实例解析--泉哥 4.XSS高级实战教程--心伤的瘦子 5.XSS利用与挖 ...

  10. .net和MVC中的json值和List<T>和DataTable的一些转换

    1.List<T>集合转换为Json值 List<ReportModel> dtList = new List<ReportModel>(); JsonResult ...