Unity-UGUI合批优化

  • 图集合批规则
  • 例如1:Blue,Green,Orange三个图片,没有打包图集时候。
  • 例如2:Blue,Green,Orange三个图片,打包为一个图集
  • 例如3:Blue,Green,Orange三个图片,Blue和Green打包到同一个图集,而Orange打包到另外一个图集,渲染顺序为Blue,Green,Orange.
  • 例如4:Blue,Green,Orange三个图片,Blue和Green打包到同一个图集,而Orange打包到另外一个图集,渲染顺序为Blue,Orange,Green。
  • 优化:所以理解了图集合批规则之后,就知道优化方向了

图集合批规则

计算层级号的算法:如果有一个UI元素,它所占的屏幕范围内(通常是矩形),如果没有任何UI在它的底下,那么它的层级号就是0(最底下);如果有一个UI在其底下且该UI可以和它Batch,那么它的层级号与底下的UI层级一样;如果有一个UI在其底下但无法与它Batch,那么它的层级号为底下的UI层级+1;如果有多个UI都在其下面,那么按前两种方式遍历计算所有的层级号,其中最大的那个作为自己的层级号。

合并时候:如果相邻间的两个批次正好可以Batch的话就会进行Batch。
Unity的UI渲染顺序的确定有2个步骤,第一步计算每个UI元素的层级号;第二步合并相同层级号中可以Batch的元素作为一个批次,并对批次进行排序;

例如1:Blue,Green,Orange三个图片,没有打包图集时候。


可以看到产生了三个DrawCall。原因:没有合并图集,需要CPU向GUI发送三次渲染请求。

例如2:Blue,Green,Orange三个图片,打包为一个图集



可以看到无论是否相交与否,都只产生了一个DrawCall。原因:三个图片都在同一个图集当中,渲染时候合批到一起,统一由CPU向GPU发送一次渲染请求即可

例如3:Blue,Green,Orange三个图片,Blue和Green打包到同一个图集,而Orange打包到另外一个图集,渲染顺序为Blue,Green,Orange.



可以看到无论是否相交,都只有2个DrawCall。原因:在Hierarchy面板中,先渲染Blue,在渲染Green,最后渲染Orange。这个顺序很重要,按照图集合并规则我们具体去分析,首先渲染Blue,计算他的层级序号,他的下面没有任何图片,所以他的层号为0。紧接着看Green,计算它的层级序号,它下面有一个图片Blue,并且Blue和Green在同一个图集当中 ,Unity引擎判定它可以合批后,它的层级序号和Blue一样为0。最后渲染Orange,他的下面是图片Green,由于Green和Orange的图片不在同一个图集,所以无法合批,它的层级序号就位0+1 = 1。
所以第一步:Unity引擎根据计算出Blue和Green层级号相同为0,而Orange层级号为1。
所以第二步:Unity引擎合并相同层级号中可以Batch的元素作为一个批次。Blue和Orange会被合批到一起由CPU向GPU发送一次渲染请求,也就是一个DC,而Orange单独由CPU向GPU发送一次渲染请求,也就是另外一个DC。所以有2个DC。

例如4:Blue,Green,Orange三个图片,Blue和Green打包到同一个图集,而Orange打包到另外一个图集,渲染顺序为Blue,Orange,Green。


第一步:Blue层级号为0,Orange层级号为0,Green层级号为0。
第二步:0层中Blue和Green可以合并到一个批次,而Orange不能,所以2个DC

操做:移动Orange覆盖Blue
第一步:Blue层级号为0,Orange层级号为1,Green层级号为0
第二步:0层级号中Blue和Green在同一图集可以合并到一个批次,1层级号Orange单独一个。所以2个DC

操做:移动Orange被Green覆盖
第一步:Blue层级号为0,Orange层级号为0,Green层级号为1
第二步:0层级中Blue和Orange不属于同一个图集无法合批,所以2个DC,1层级号中只有Green单独一个元素,所以单独一个DC。所以总共三个DC

操做:移动Green覆盖Blue
第一步:Blue层级号为0,Green层级号为0,Orange层级号为0
第二步:0层级号中Blue和Green可以合批,一个DC,Orange单独一个DC。所以2个DC

操做:移动Green覆盖Orange。和上面移动Orange被Green覆盖一个道理。这里还是说明一下
第一步:Blue层级号为0,Green层级号为1,Orange层级号为0
第二步:0层级中Blue和Orange不在同一个图集2个DC,1层级中Green单独一个DC。所以三个DC

操做:移动Blue被Orange覆盖和移动Orange覆盖Blue一个操做
第一步:Blue层级号为0,Orange层级号为1,Green层级号为0
第二步:0层级中Blue和Green在同一个图集可以合批,1个DC。1层级中Orange一个DC。所以2个DC

操做:移动Blue被Green覆盖。和移动Green覆盖Blue一个操做
第一步:Blue层级号为0,Orange层级号为0,Green层级号为0.
第二步:0层级号中Blue可以和Green合批。一个DC。Orange单独一个DC。所以2个DC

操做:移动Orange和Green如图所示
第一步:Blue层级号为0,Orange层级号为1,Green层级号为2.
第二步:0层级中Blue一个DC,1层级中Orange一个DC,2层级中Green一个DC。总共三个DC

操做:如图所示将三个图片叠起来
第一步:Blue层级号为0,Orange层级号为1,Green层级号为2
第二步:0层1一个DC,1层级一个DC,2层级一个DC。三个DC

优化:所以理解了图集合批规则之后,就知道优化方向了

DrawCall:就是CPU向GPU发送的一次渲染命令。
在降低DC方面,我们则需要做的就是尽可能的让CPU多打包一些信息给GPU,那么DC就自然降低了。在UGUI里面,先不考虑Shader,UI元素中材质和纹理相同的元素就可以被合批。
所谓的图集:将很多的2DSprite通过Atlas打包合并到一张大图,那么为什么要这么做?
1。CPU向GPU发送渲染命令时候,只需要大图就可以了,因为GPU会在这个大图中进行采样,然后根据规则生成界面。所以这里也就是为什么需要同一个图集的原因,如果真的只有一个图集,那么一个DC就可以把所有需要的信息传递给GPU,然后GPU就开始绘制。
2.图集尺寸是可选的,都为2的次数幂,图片尺寸为2的次数幂时候处理起来会比不规则的(图片尺寸不为2 的次数幂)快,就算美术给的图不是2的次数幂,但是打成图集之后也是2的次数幂。这是Unity的设计
3.理想化就是将所有的图打包为一个图集,这样就只会有一个DC了,但是这可能吗?如果图片资源非常多,那么这张图片可能就非常大了,资源就非常大了,Unity也不允许,所以设置了最大范围。所以这个时候我们就需要按照一定的设计规则去进行分类。我们当然是希望DC越少,资源越少。但这是一个互斥的话题。折中思想在古代就一直非常流行,所以都是去找一个平衡点。A:例如一些公共按钮,公共边框,作为公共资源尽可能打包到一个图集当中,如果不够就2-3个。B:按照功能模块进行划分;

Unity图集优化原理相关推荐

  1. Unity UGUI优化与原理【unity官方】

    来源( 来源:unity官方 Optimizing Unity UI ) 官方链接: [1]  https://unity3d.com/cn/learn/tutorials/temas/best-pr ...

  2. Unity 性能优化:资源篇

    Unity性能优化 大的方面来说,通过Unity对于项目的性能优化大概可以分为下面几个部分: 资源 渲染 程序 项目配置 而在这个部分中,资源的性能优化属于最基础.最有效的优化手段,也是游戏开发者日常 ...

  3. Unity 性能优化(力荐)

    开始之前先分享几款性能优化的插件: 1.SimpleLOD : 除了同样拥有Mesh Baker所具有的Mesh合并.Atlas烘焙等功能,它还能提供Mesh的简化,并对动态蒙皮网格进行了很好的支持. ...

  4. Unity - 性能优化 - 包体,内存 - 偏静态资源的优化

    文章目录 静态资源优化 - AssetPostprocessor Texture 压缩 Model 网格.动画 压缩 音频压缩 纹理的优化经验 尺寸 通道 发布出来的包资源再次分析 如何工具快速定位静 ...

  5. Unity DrawCall优化

    Unity DrawCall优化 一 Mesh Renderer  二 Skinned Mesh Renderer  三 合并要求对比  四 总结  五 场景制作建议 DrawCall优化合并,也叫批 ...

  6. Unity UI优化策略

    Unity UI优化策略 前言 最近学习了Unity的图形渲染和UI的优化部分,感觉还是有挺多东西的.在此做一个简单的总结和记录. 如果把计算机绘制想象成画画,想要加快画画速度,我们可以从几个方面来进 ...

  7. 《Unity游戏优化》第三章 批处理

    动态批处理.静态批处理.GPU Instancin 和SRP Batcher 批处理原理 批处理设置 Frame Debugger 1. 动态批处理 动态批处理使用场景 动态批处理优势: 动态批处理缺 ...

  8. Unity性能优化 – 脚本篇

    最近开始进行Unity性能优化的工作,主要分为三类:CPU.GPU和内存.由于我们游戏的核心战斗是计算密集型,所以主要是受限于CPU.CPU的优化又分为渲染和脚本,本文将着重于脚本优化. 一般来说,优 ...

  9. unity图像压缩算法原理

    概述 在计算机图形学中,存在许多纹理压缩方案.压缩既减少了纹理内存占用,又降低了使用纹理的带宽要求.本文中,"纹理压缩"与"图像压缩"不同,因为纹理压缩方案的设 ...

最新文章

  1. html表格筛选排序规则,excel表的排序功能你真的会吗?带你重新认识真正的排序功能...
  2. canvas - 饼状图
  3. iOS微博web网页出现的天坑 (斗鱼App 当前版本5.600有这个bug)
  4. linux系统知识 - 信号基础
  5. php 验证url,php过滤器filter验证邮箱、url和ip地址等
  6. perl对文件和目录进行操作
  7. Raphael JS 矢量客户端开源框架
  8. RMAN备份恢复报错 ORA-19573: cannot obtain exclusive enqueue for datafile 5
  9. java占32位存储空间时,java空间
  10. js 判断图片是否加载完成
  11. 《x86汇编语言:从实模式到保护模式》课后答案
  12. 数据结构之基于Java的顺序队列实现
  13. 从0成为Facebook广告高手系列教程,Facebook广告数据分析上篇
  14. SpringCloud:汇总(Gradle项目)
  15. JQuery中关于html()、text()、val()三者之间的区别
  16. where 1=1 是什么鬼?SQL中有这玩意?
  17. PDF编辑器怎么用,如何旋转PDF页面
  18. 无法打开计算机桌面图标,桌面图标打不开如何修复?桌面图标无法打开的处理方法...
  19. c++练手项目:英语单词拼写测试程序
  20. 用一个二维码做下载app,自动区分是 ios 还是 android

热门文章

  1. 极客时间和极客学院_极客和书呆子之间的区别
  2. rds 主从实例_探索Amazon RDS数据库实例和漏洞
  3. stm32【GT30L32S4W字库芯片】
  4. 2023中国(上海)国际大豆食品加工及设备展览会
  5. 美杜莎暴力破解ssh【服务使用有危险,望君谨慎】
  6. stm32f103vet6利用fsmc控制LIL9341液晶屏
  7. 使用WebClient实现文件下载
  8. 华为鸿蒙系统提升,首个华为鸿蒙2.0续航测试来了!实打实10%提升
  9. java基础网络编程
  10. uefi模式装gho格式系统失败的原因