前言:Layout是UI自动布局神器,但是大量使用,性能又是令人捉急的,还有一个毛病就是,要获取content真实size的时候,总是要延迟一帧才能拿到真实数据,让我们来研究一下layout的实现

在UGUI的使用中,编辑器或者运行时,对于一个LayoutGroup,当激活它、调整它的RectTransform、增删它的子节点时,都会触发它的子节点的自动布局重建动作。下面是相应代码。

标记更新布局

protected override void OnEnable()

{

base.OnEnable();

SetDirty();

}

protected override void OnRectTransformDimensionsChange()

{

base.OnRectTransformDimensionsChange();

//注意OnRectTransformDimensionsChange中有一个isRootLayoutGroup的属性判断。 //只有该LayoutGroup没有受控于父节点的ILayoutGroup时才会触发SetDirty。 if (isRootLayoutGroup)

SetDirty();

}

protected virtual void OnTransformChildrenChanged()

{

SetDirty();

}

首先看一下为啥要延迟一帧:在SetDirty方法里,如果没有注册到CanvasUpdateRegistry里,就注册有注册的话,就开个协程,在下一帧调用LayoutRebuilder.MarkLayoutForRebuild(rectTransform)。CanvasUpdateRegistry这个类之前在Graphics的章节见到过,它是一个单例类,各UI向其注册更新事件,以在适当的时机被其调用更新对应的内容。

protected void SetDirty()

{

if (!IsActive())

return;

if (!CanvasUpdateRegistry.IsRebuildingLayout())

LayoutRebuilder.MarkLayoutForRebuild(rectTransform);

else

StartCoroutine(DelayedSetDirty(rectTransform));

}

IEnumerator DelayedSetDirty(RectTransform rectTransform)

{

yield return null;

LayoutRebuilder.MarkLayoutForRebuild(rectTransform);

}

有时候希望布局以后自动计算RectTransform的区域,那么就不得不再挂上一个Content Size Fitter组件了,它是在LayoutRebuilder中等待Rebuild()时调用,那么势必会再次造成Rebuild()。

不得不说 Content Size Fitter、VerticalLayoutGroup、HorizontalLayoutGroup、 AspectRatioFitter、GridLayoutGroup组件效率是很低的,它们势必会导致所有元素的Rebuild()执行两次。

1、界面第一次打开需要进行第一次Rebuild()

2、Layout组件要算位置或者大小会强制再执行一次Rebuild()

很有可能有些元素是不需要Rebuild的,但是Layout组件也会强制执行,那么势必造成额外的开销。

Layout还有Min Wdith和Flexible Width可设置最小宽高和弹性宽高,这都需要进行额外的计算产生额外的开销,如果对效率要求比较高的UI,最好可以考虑自行封装一套布局组件。

unity 刷新layout_【Unity源码学习】Layout相关推荐

  1. Unity中的UGUI源码解析之事件系统(9)-输入模块(下)

    Unity中的UGUI源码解析之事件系统(9)-输入模块(下) 接上一篇文章, 继续介绍输入模块. StandaloneInputModule类是上一篇文章介绍的抽象类PointerInputModu ...

  2. Unity中的UGUI源码解析之图形对象(Graphic)(2)-ICanvasElement

    Unity中的UGUI源码解析之图形对象(Graphic)(2)-ICanvasElement 在上一篇文章中, 我们对整个Graphic部分做了概述, 这篇文章我们介绍ICanvasElement和 ...

  3. Unity中的UGUI源码解析之事件系统(2)-EventSystem组件

    Unity中的UGUI源码解析之事件系统(2)-EventSystem组件 今天介绍我们的第一个主角: EventSystem. EventSystem在整个事件系统中处于中心, 相当于事件系统的管理 ...

  4. Unity中的UGUI源码解析之事件系统(3)-EventData

    Unity中的UGUI源码解析之事件系统(3)-EventData 为了在事件系统中传递数据, Unity提供了EventData相关的类来封装这一类数据. 了解这些结构有助于我们对后面模块的学习. ...

  5. unity飞行模拟游戏源码,支持安卓+IOS双端 unity2019 C#语言开发

    unity飞行模拟游戏源码,支持安卓+IOS双端 unity2019 C#语言开发.完整的源码可直接运营.拿来学习研究和二次开发都很不错. 源码下载 unity2019飞行模拟游戏源码C#语言开发-U ...

  6. rts游戏服务器源码,unity即时战略游戏源码Real-time strategy (RTS) game kit

    unity即时战略游戏源码Real-time strategy (RTS) game kit (Modern Tactics) 1.2.1 Requires Unity 4.5.2 or    hig ...

  7. Unity中的UGUI源码解析之事件系统(8)-输入模块(中)

    Unity中的UGUI源码解析之事件系统(8)-输入模块(中) 接上一篇文章, 继续介绍输入模块. Unity中主要处理的是指针事件, 也就是在2d平面上跟踪指针设备输入坐标的的事件, 这一类事件有鼠 ...

  8. Unity中的UGUI源码解析之事件系统(6)-RayCaster(下)

    Unity中的UGUI源码解析之事件系统(6)-RayCaster(下) 接上一篇文章, 继续介绍投射器. GraphicRaycaster GraphicRaycaster继承于BaseRaycas ...

  9. RecyclerView源码学习笔记(一)构造函数和setLayoutManager方法

    前言 RecyclerView已经出来很久,现在几乎应该都会用RecyclerView代替Listview,虽然我觉得大多数人应该还是不太清楚这两者之前的区别的,或者说RecyclerView相对于L ...

  10. GameFramework源码学习(一)

    GameFramework源码学习(一) 文章目录 一.GameFrameWork是什么? 二.框架学习 1.框架入口 2.UI模块初步了解 一.GameFramework是什么? GameFrame ...

最新文章

  1. Selenium 页面自动化测试 面试 问题汇总
  2. 真是O(1)吗?想清楚了没?
  3. android 数组赋值字符串_c++数组使用
  4. Cpp 对象模型探索 / 继承关系下的虚函数手动调用
  5. 【Nginx】应用静态化配置
  6. [ solr入门 ] - 利用solrJ进行检索
  7. ThinkPHP扩展,实现Redis的CURD操作。
  8. 研究svg编辑器过程中遇到的问题总结
  9. 刺激战场android免费辅助网盘,刺激战场xs辅助
  10. Python的Excel/Word库
  11. 泥瓦匠想做一个与众不同的技术匠
  12. 仓库管理系统怎么选?想高效管理仓库的老板,别错过这篇干货!
  13. 像写Flutter一样开发Android原生应用
  14. MoviePy - 中文文档4-MoviePy实战案例-重新构建15世纪舞蹈视频
  15. Jmeter导出性能测试报告
  16. 微信开发者工具 页面颜色调整(多与黑白)
  17. Redis详细教程-学习笔记
  18. android4.4.2康佳电视,康佳电视怎么连接手机 康佳电视连接手机步骤【图文介绍】...
  19. 在最好的白银要趋避的交易心理陷阱
  20. 如何分析大流量网络波动,保障关键业务的安全性?

热门文章

  1. 神经机器翻译(Neural machine translation, NMT)学习笔记
  2. 生产环境和开发环境_环境部署:开发、测试和线上环境的区别
  3. 计算机网络进入特权模式在哪里,计算机四级考试网络工程师考点一
  4. 关于长高问题 我的看法
  5. 模拟私网问题导致节点宕机无法启动
  6. 华为防火墙笔记-出口选路
  7. 旌扬机器人_“http://club.liangchanba.com/”搜索蜘蛛、机器人模拟抓取结果--站长工具...
  8. 伤疤好了有黑印怎么办_疤痕留下黑印怎么办
  9. 三部门禁止对新能源车限购 专家:京沪情况复杂,政策仍不明朗
  10. 怎样取消Windows 10的虚拟桌面切换动画和窗口动画