UGUI 合批原理

转自: UGUI合批原理笔记 - 赵青青 - 博客园

UGUI合批规则图解_时光不染-CSDN博客_ugui合批规则

合批的过程#

image

网格更新机制#

  • Cavans.SendWillRenderCanvas
    • m_LayoutRebuildQueue
    • m_GraphicRebuildQueue

  • Canvas.BuildBatch 更新所有DrawCall
    • WaitingForJob 子线程网格合并
    • PutGeometryJobFence
    • BatchRendere.Flush UI如果开多线程渲染,BatChRender.Flush会增高,主线程在等待子线程的结果时Flush会等待。

哪些因素的改变会引起合批#

从源码中可以看到,这些数据的改变会引起合批

源码地址: UI / UnityEngine.UI / UI / Core / Utility / VertexHelper.cs 

复制代码

private List<Vector3> m_Positions = ListPool<Vector3>.Get();//顶点位置的拷贝或指定新顶点位置的数组
private List<Color32> m_Colors = ListPool<Color32>.Get();//颜色
private List<Vector2> m_Uv0S = ListPool<Vector2>.Get();//基本纹理坐标
private List<Vector2> m_Uv1S = ListPool<Vector2>.Get();//第二套纹理坐标
private List<Vector2> m_Uv2S = ListPool<Vector2>.Get();//第三套纹理坐标
private List<Vector2> m_Uv3S = ListPool<Vector2>.Get();
private List<Vector3> m_Normals = ListPool<Vector3>.Get();//法线
private List<Vector4> m_Tangents = ListPool<Vector4>.Get();//切线
private List<int> m_Indices = ListPool<int>.Get();//mesh的索引

复制代码

Mesh的API:http://wiki.ceeger.com/script/unityengine/classes/mesh/mesh

http://wiki.ceeger.com/script/unityengine/classes/mesh/mesh.getindices

怎么避免合批#

尽量减少“动态”长文本(运行时修改文本内容)

Image或Text,如果不需要点击,则不要勾选Raycasts

降低界面的更新频率

避免图集分离,使用相同的图集。

同一图集的Image元素应尽量保证在Hierarchy中连续,避免中间插入其他图集,或插入文本。

避免图片叠加在一起(遮挡,旋转)

如果sprite是中心镂空且切图为九宫格时,可以去除fill center,以减少over draw

透明Image,用来做响应点击事件,同样存在开销

避免或减少Mask的使用,1个Mask至少增加两个DC

避免频繁删除/增加UI对象,UI层次结构变化会引起Canvas的更新

避免频繁动态的更新UI元素的Vertex, Rect, Color, Material, Texture等,可能引起Canvas数据更新和Batch更新计算,有可能引起VBO Update(重新提交顶点数据)。

尽可能使用少的UI Material和贴图(使用图集),使得可以Batching。

同一父节点下所有子节点,保持相同的层次结构(如List控件下的item),便于底层相同depth下UI元素Batch。

避免UI元素数目过多和层次结构过于复杂影响Batch更新速度。

固定的Text考虑与背景图层合在一张图上(可能不便本地化,但可以减少drawcall)。

使用缓存池,对缓存频繁使用的元素。

部分内容参考:http://gad.qq.com/article/detail/25947

HUD处理(动静分离)#

Canvas重建就是为了合并DC,将经常变化的文字放在独立的Canvas,手动分离Canvas(会增加DC,不能和其它文字合并),但文字变化时其它Canvas就不需要重建。

示例:名字和血条分开在两个不同的节点下。这样当血条变化时,就不会引起名字的更新。如下图所示:

image

2、设置scale为0,而不是设置active = false/true,或者添加Alpha Group,设置alpha=0/1

不勾选FillCenter#

镂空九宫格不勾选FillCenter,在Scene的Overdraw下可以查看到,不勾选FillCenter,overdraw会减少。

image

少用Effect功能#

少用Outline,Tiled Sprite

outline额外生成7倍顶点#

在一个空场景中,给Text添加outline之后,顶点数大约是未添加之前的7.5倍。

image

去掉outline之后,顶点数下降了很多。

image

Image不使用Tiled#

type=simple时的顶点数

image

使用Tiled之后,顶点数也上涨很多。

image

参考资料#

Unity官方论坛发布 Unity UI性能优化技巧

UGUI优化:批次合并源码分析及工具

工具:UI层级辅助工具,用于显示UI的层级、批次等数据,便于UI性能优化。使用者可以结合以上规则,分析当前UI元素排列顺序、材质贴图设置,优化UI Batching,减少UI Drawcall。

image

Unity UI优化小结

重建 是UGUI优化的关键 -- Unite2017嘉宾杨怀忠分享《UGUI深度优化》

原理图解
批处理: 大致就是Unity在运行时可以将一些物体进行合并,本来需要多个drawcall指令才能渲染完成的降为1个drawcall就能搞定

使用: UGUI在合批之前,会根据ui的Depth、MaterialID 、MaterialID、RendererOrder进行排序,之后对相邻的UI进行检测。判断MaterialID和TextureID是否相同,如果相同则可以进行合批处理。如果不同则会打断合批

先决条件:MaterialID,TextureID相同
这两个很容易达成,不对默认Material做修改,并使用同一个图集即可
我们这里主要讲解的是打断合批的情况

排序图解
首先看下图


文字 Texture 是Font Texture

 

 


空白图片 Texture 是UnityWhite


1.首先由Depth排序,盖在最里面的白色图片深度为0
2.Text在白色图片上面,二者材质(Material)相同,但纹理(Texture)不同,不能合批,Text深度为1
3.再往下,红色图片盖在Text上面,同理不能合批,red深度为2
4.黄色和红色材质和纹理都相同,可以合批,yellow深度为2
5.同理绿色图片green深度为2

 

这里我们打开Profiler(command + 7)看一下,3个批次符合判断


注一
以上覆盖关系与控件大小无关,与控件在Hierarchy的布局位置无关,只与渲染的三角面有关,如图

 

 

scene选择Wireframe,可以看到渲染的三角面

显示如下,控件大小为蓝色调整大小的区域,实际渲染的只有左上的小方块三角面


红色图片的方框一部分与Text线框重合。所以打断了合批。
我们尝试把Text上移一些,如下图

 

 

 

 

对比以上图片可发现,Hierarchy布局未发生变化,只是移动了Text的位置,Text区域框依然和red区域有重叠。合批却发生了变化。

实例图解
实际应用案例
下面是一个常见界面,对比一下合批的效果


不打包图集

 

 

使用图集

 

一些注意事项
1.一些打断合批的细节
如图,第一个道具的 label_destory 没有隐藏,img_btn 能完全覆盖,显示效果是一样的。

 

但是label_destory 会打断 img_cellBg 与 img_btn的合批,平白多出2个批次


2.图集打包的注意事项

 

drawcall并不是最求极限越小越好。
如文中的道具图标,如果有大量图标,打包到同一个图集里会使图集很大。
决定渲染模块性能的除了Draw Call之外,还有用于传输渲染数据的总线带宽。当我们使用Draw Call Batching将同种材质的网格模型拼合在一起时,可能会造成同一时间需要传输的数据(Texture、VB/IB等大大增加,以至于造成带宽“堵塞”,在资源无法及时传输过去的情况下,GPU只能等待,从而反倒降低了游戏的运行帧率
这种界面一般重复使用的UI打包为一个图集。
图标根据数量分为多个图集,或者由美术直接提供图集自己做裁切。
图集大小根据各公司规范略有不同,大多是512或1024
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vb.net 设置打印纸张与页边距_装订文档时不想让文字被挡住?在Excel中你可以这样设置打印!...

平时我们在打印文档的时候&#xff0c;通常会把文档左侧的页边距设置的大一点&#xff0c;这样在装订的时候显得美观一点。但如果我们进行双面打印时&#xff0c;文档左右两边的页边距刚好相反&#xff0c;装订时第2页的文本很容易被挡住&#xff0c;这样子反而更难装订了。那么…

CPU Cache原理与示例

转自这篇 CPU Cache&#xff0c;估计也没人看 基础知识 首先&#xff0c;我们都知道现在的 CPU 多核技术&#xff0c;都会有几级缓存&#xff0c;老的 CPU 会有两级内存&#xff08;L1 和 L2&#xff09;&#xff0c;新的CPU会有三级内存&#xff08;L1&#xff0c;L2&#x…

python集合的基本操作不包括_Python基础知识储备,List集合基本操作大盘点

List列表是Python中最基本的数据结构&#xff0c;也是Python中使用频率最高的数据类型&#xff0c;List列表中的元素不需要具有相同类型&#xff0c;使用起来非常方便。现在就来体验一下List列表的基本操作。 list集合基本操作 List的基本操作&#xff08;&#xff0c;copy&…

mysql blob hex_数据库的完整备份与恢复 quot;--hex-blobquot; - - ITeye博客

闲言少絮&#xff0c;这个程序利用MySql数据库自带小程序进行数据库的备份和还原。这两个程序分别是&#xff1a;mysql.exe和mysqldump.exe。这两个程序在您安装Mysql数据库的时候会自动安装到数据库的bin目录。这两个程序存在的目录为&#xff1a;C:\Program File\MySQL\MySQL…

android中怎么保存checkbox中的checked属性_Vue 精粹:v-model指令在组件中怎么玩

最近在写组件的时候&#xff0c;遇到了 v-model 的使用问题&#xff0c;在 Vue 官方文档中&#xff0c;有两小端内容是关于 v-model 指令在组件中的使用,查阅文档后&#xff0c;依然不得要领&#xff0c;最后几番折腾&#xff0c;理论结合实践&#xff0c;终于领悟其精髓&#…

linux location root访问文件夹404_如何使网站支持https访问?nginx配置https证书

购买SSL证书要想使用https访问你的网址&#xff0c;首先得拥有颁发的SSL证书。我使用的是免费版&#xff0c;有效期为一年&#xff0c;过期后再重新申请。申请SSL证书购买后&#xff0c;可在搜索框输入证书关键字进入到控制台。点击证书申请&#xff0c;按照提示填写完相关信息…

mysql rank函数_Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介

排名函数是Sql Server2005新增的功能&#xff0c;下面简单介绍一下他们各自的用法和区别。我们新建一张Order表并添加一些初始数据方便我们查看效果。表结构和初始数据Sql附上表结构和初始数据图&#xff1a;一、ROW_NUMBERrow_number的用途的非常广泛&#xff0c;排序最好用他…

git2.29.2.2怎么安装_MySQL5.5怎么安装

安装MySQL5.5的步骤&#xff1a;1、 官网下载mysql5.5下载地址&#xff1a;http://dev.mysql.com/downloads/mysql/5.5.html#downloads2、 安装mysql5.5注意&#xff0c;安装之前&#xff0c;请关闭杀毒软件。1)、 打开下载的mysql-5.5.53-winx64.msi2) 、点击下一步3)、 选中复…

未声明spire。它可能因保护级别而不可访问_信息系统安全:访问控制技术概述...

1.访问控制基本概念身份认证技术解决了识别“用户是谁”的问题&#xff0c;那么认证通过的用户是不是可以无条件地使用所有资源呢&#xff1f;答案是否定的。访问控制(Access Control)技术就是用来管理用户对系统资源的访问。访问控制是国际标准ISO7498-2中的五项安全服务之一&…

c++反汇编与逆向分析技术揭秘_C++反汇编与逆向分析技术揭秘

一、单类继承在父类中声明为私有的成员&#xff0c;子类对象无法直接访问&#xff0c;但是在子类对象的内存结构中&#xff0c;父类私有的成员数据依然存在。C语法规定的访问限制仅限于编译层面&#xff0c;在编译过程中进行语法检查&#xff0c;因此访问控制不会影响对象的内存…

std::atomic原子操作

第十一节std::atomic原子操作_HITXJ的博客-CSDN博客_std::atomic用法

php与mysql列表_PHP+Mysql+jQuery实现的查询和列表框选择

本篇文章主要介绍PHPMysqljQuery实现的查询和列表框选择&#xff0c;感兴趣的朋友参考下&#xff0c;希望对大家有所帮助。本文讲解如何通过ajax查询mysql数据&#xff0c;并将返回的数据显示在待选列表中&#xff0c;再通过选择最终将选项加入到已选区&#xff0c;可以用在许多…

range函数python2和3区别_range函数python2和3区别

range函数是一个用来创建算数级数序列的通用函数&#xff0c;返回一个[start, start step, start 2 * step, ...]结构的整数序列&#xff1b;py2中的range()函数用法&#xff1a;&#xff08;推荐学习&#xff1a;Python视频教程&#xff09; range()返回的是一个列表>>&…

Unity SRP自定义渲染管线 -- 2.Custom Shaders

本章将接着上一篇文章&#xff0c;在初步实现一个渲染管线后来创建自定义的shader。上一篇文章的链接 https://blog.csdn.net/yinfourever/article/details/90516602。在本章中&#xff0c;将完成以下内容&#xff1a; 写一个HLSL Shader定义constant buffer&#xff08;常量缓…

tcp 三次握手与四次挥手_TCP三次握手与四次挥手详解

TCP报文结构源端口和目的端口&#xff1a;各占2个字节&#xff0c;分别写入源端口号和目的端口号。序号&#xff1a;占4个字节。序号使用mod运算。TCP是面向字节流的&#xff0c;在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。故该字段也叫做“报文段序号”。确认序…

网关和路由器的区别_5G工业路由器与5G DTU的区别介绍详解

5G工业路由器和5G DTU都是实现无线网络数据传输功能&#xff0c;而两者间的区别主要从使用方法、外观接口以及应用环境等方面区分&#xff0c;今天给大家介绍5G工业路由器和5G DTU的一些不同点。使用方法的不同:5G工业路由器&#xff1a;5G路由器可对以太网、现场总线通信协议进…

7628刷breed_自制各类路由原厂直刷Breed的文件,无需修改mac无需重刷无线

本帖最后由 showme99 于 2017-3-25 16:35 编辑在原厂页面直接选择相应的刷机文件刷机&#xff0c;文件很小256K&#xff0c;大约十秒左右就自动进入Breed后直接刷入dd-wrt,opentwrt,gargoyle等固件即可。无需在Breed里设置MAC地址&#xff0c;也无需刷入ART无线文件&#xff0c…

c语言获取系统剩余内存_C语言编程中的“堆”和“栈”七大不同之处

更多精彩&#xff0c;请点击上方蓝字关注我们&#xff01;对于编程初学者来说会接触到一些难以理解的名称&#xff0c;比如堆(heap)、栈(stack)、堆栈(stack)等。初学开发过程中往往让人混淆不清。今天我们来谈谈堆和栈的具体区别&#xff0c;来帮助初学者理清思路。堆和栈的区…

sql between包括两端吗_SQL大全

作者&#xff1a;静默虚空排版&#xff1a;MarkerHub原文&#xff1a;https://juejin.im/post/5c7e524af265da2d914db18f本文针对关系型数据库的一般语法。限于篇幅&#xff0c;本文侧重说明用法&#xff0c;不会展开讲解特性、原理。一、基本概念数据库术语数据库(database) -…

python交互模式什么意思_Python中的交互模式是什么

让开发者能快速学习、测试 Python 的各种功能&#xff0c;Python 提供的“python”命令不仅能用于运行 Python 程序&#xff0c;也可作为一个交互式解释器一一开发者逐行输入 Python 代码&#xff0c;它逐行解释执行。 当输入“python”命令时&#xff0c;可以看到如下输出结果…