在我们项目开始用ugui做UI开始就一直有在显示或者隐藏(用的是gameobject的setactive接口)UI的时候会产生gc以及一些计算,这个主要是unity的maskablegraphic在onenable的时候做了graphic的rebuild以及layout的rebuild,在ondisable的时候也做了一些计算。

刚开始有用把整个UI界面移出屏幕的方法来避免显示隐藏的消耗,但是dc还会在哦。还用了一种把UI的scale设为0,0,0。dc是消掉了,但是如果UI里面有粒子系统,某些粒子系统是不受scale影响的。还可能会影响UI里面的tween动画。显然这两种方式并不是很好用。

今天改了ugui的底层,把maskablegraphic类里面的updatemodifiedmaterial虚函数重写掉,它的子类并没有重写这个函数,所以我们直接派生相关的UI组件,并重写它,里面主要有一行代码会去获取mask组件,这个是很耗的。通过缓存mask组件,可以避免这个消耗,同时预留一个setmask接口,避免后面有添加mask组件时,要调用这个接口。这样了弄了之后,显示隐藏UI的gc下降了2/3。但是仍然还有一些消耗。

通过在UI的根节点添加cavas组件,用这个组件的enable代替gameobject的setactive接口,显示以及隐藏UI变成0消耗。至此,这个问题完美解决!

当使用canvas显示隐藏UI的时候,底下的非UI元素(特效,如meshrender,particlesystem)不受控制。通过在特效根节点加一个组件,继承UIbehaviour,重写oncanvashirerchychanged接口,当UI根节点的canvas状态发生改变时会回调这个函数。我们在这个函数控制特效子对象。对于meshrenderer,我们对组件的enabled进行设置,particlesystem,我们用play以及stop进行控制,还有clear接口。

当查看显示隐藏UI的gc消耗的时候发现有4个lua回调c#的接口gc非常高,通过导出c#类到lua解决。

当canvas下面还有canvas并且勾选了overridesorting,底下canvas就不受顶部canvas控制。这个时候就不适合用canvas模式来控制显示隐藏。

原先对mask的缓存是在awake获取,但是当UI对象很多并且大部分没有mask组件的时候,会造成不必要的性能损耗。因此最后我们把mask变成public字段,并在editor显示它,然后写个工具把所有mask获取到并缓存起来。同时要注意当后面动态加了mask组件,要自己设置引用,这个可以通过封装add mask组件接口来实现。

关于ugui界面显示隐藏的优化相关推荐

  1. 【unity shader】基于UGUI字体的outline优化

    基于Shader实现的UGUI描边解决方案 找了一下outline的一些优化的实现方案,但是那个方案的两层text叠加或者是image叠在上面会出现颜色偏差问题. 目前已找到对应的问题并进行了一些修复 ...

  2. div 隐藏_SEO优化,隐藏文本与隐藏链接对SEO的影响!

    对于SEO行业而言,隐藏文本(HiddentText)是一个古老而又久远的话题,它早期主要用于提高页面对特定关键词的相关性,由于这部分内容对用户不可见,常常被算法识别为作弊行为. 但即便如此,仍有众多 ...

  3. Unity基础知识学习五,UGUI优化相关

    1.什么是UGUI优化,UGUI优化的理论基础 1.1理论基础 Canvas, 是Unity渲染系统给层状几何体( layered geometry  )提供的可以被画入.被放在上面或者放在世界空间的 ...

  4. Unity 性能优化基础

    文章目录 前言 一.代码层面 二.减少Rebatch和Rebuild 1.Rebatch 2.Rebuild 3.优化点 三.降低OverDraw 总结 前言 最近笔者在找工作,面试过程经常被问到工作 ...

  5. 上传和优化Magento 2中的产品图像和视频

    2019独角兽企业重金招聘Python工程师标准>>> 首先,了解如何上传以及优化Magento 2中产品的图像和视频是至关重要的.大多数Magento 2网站都有各种各样的产品以及 ...

  6. 需要某个字体包才能正确显示此页面_[三分钟小文]前端性能优化-页面加载速度优化...

    本期内容请记住一个核心:JavaScript很快,DOM很慢 阅读本文您将收获: 从用户输入URL到看得到页面的过程 页面渲染过程 在页面加载层级的性能优化 用户看到页面之前都经历了什么 这一部分是面 ...

  7. 原来华为手机还有3大隐藏省电功能,开启后,两天一充很简单

    如今的手机性能都很不错,在日常使用方面也很流畅,但就是电池技术进展缓慢,虽然现在的手机电池都是标配4000毫安,但还是觉得电量很不耐用. 其实华为手机的省电技巧有很多,今天笔者就分享3个华为手机隐藏省 ...

  8. SEO优化之og:标签

    文章目录[隐藏] SEO 优化 og 标签前言 SEO 优化 og 标签历史 SEO 优化 og 标签常用标签 SEO 优化 og 标签例子 1 SEO 优化 og 标签例子 2 SEO 优化 og ...

  9. C++ 性能优化篇一《优化概述》

    1.1 优化是软件开发的一部分 优化是一项编码活动.在传统的软件开发过程中,直到编码完成,项目进入了集成与测试 阶段,能够观察到程序整体的性能时,才会进行优化.而在敏捷开发方式中,当一个带有 性能指标 ...

  10. Unity制作头顶血条方式对比与优化

    制作方式主要有四种:OnGUI.NGUI.UGUI.Shader 区别 UGUI的Canvas 有世界坐标和屏幕坐标 UGUI的Image可以使用material UGUI通过Mask来裁剪,而NGU ...

最新文章

  1. UE4_Lighting Scenarios
  2. CSP认证201512-3 画图[C++题解]:dfs、左下角建系、坐标反着读入
  3. Scala入门到精通——第十五节 Case Class与模式匹配(二)
  4. Hibernate+mysql 中文问题解决方案.
  5. Cannot read property ‘forceUpdate‘ of undefined
  6. 软件测试 学习之路 Linux基础命令 (一)
  7. python彩票结果分析_天啦噜!Python多线程居然是骗人的?
  8. python容器装水_Python版LeetCode11. 盛最多水的容器
  9. WinFom解决最小化最大化后重绘窗口造成闪烁的问题
  10. [20180801]insert导致死锁.txt
  11. python配置文件读取环境变量_转载:Python项目读取配置的几种方式
  12. TensorFlow学习笔记之 PReLU激活函数原理和代码
  13. java 获取各省市的区号_城市查区号示例代码
  14. java是什么类型语言_java属于什么类型语言
  15. 匹配的通配符很全面,但无法找到元素mvc:annotation-driven的声明
  16. 【模电】习题知识点总结(持续更新ing)
  17. C语言文件操作与系统文件操作接口
  18. css3上升悬浮粒子特效,HTML5 CSS3星空背景悬浮粒子动画特效
  19. python day9
  20. android:layout_margin真实含义 及 自定义复合控件 layout()执行无效的问题解决

热门文章

  1. Rust: map中的问题,两种写法有什么不同?
  2. (转)Rust: Rust的 Deref 运算符
  3. (转)证券投资及财富管理市场创新趋势
  4. (转)马云又在押宝智能投顾!
  5. Julia: save 和load的用法 和与Matlab的效率比较
  6. 【三维路径规划】基于matlab麻雀算法求解无人机三维航迹优化问题【含Matlab源码 301期】
  7. 【预测模型】基于matlab BP神经网络预测【含Matlab源码 221期】
  8. ai的利与弊 辩论_为什么AI辩论失败了
  9. java 设计模式的相似_聊聊Java中几种常用的设计模式
  10. mysql linux内核_mysql 5.7.15 vs mysql 5.6.31性能测试以及不同linux内核性能比较