Unity-Sprite Atlas+UGUI系统的运行原理

每日一句:别听世俗耳语,看自己的风景就好

目录

SA的原理:

SA的优点:

SA的缺点:

DrawCall是什么?

批处理是什么?

我们先了解一下UGUI系统的运行原理吧!


提到图集优化,我想引出一个经典的游戏优化案例:

《超级马里奥》的Tile压缩方法:

由于红白机的性能相比现在的家用主机来说极为有限,无论是储存器性能还是处理器性能,所以当时的开发者采用“Tile瓦片”(每个瓦片8X8像素大小)作为基本的图片存储单元,然后再把这些瓦片拼接在一起。

如此以来画面分辨率256X240的红白机用8X8瓦片来填满只需要32 * 30 = 960张瓦片,给每个瓦片一个0至255的编号,那么最多只需要960B来表示一个屏幕里的所有图片,并且瓦片的内容是重复的并且个数是有限的,所要求的存储性能以及内存性能都因此大大降低。

当然为了极致的性能压缩性能,那个时代的开发者也应用了不少的技巧:

1.一个角色的行走动画,用一张图片进行左右交替翻转就能实现,减少了存储压力。

2.天上的云地上的草叠加放置,表现大小规模不同。

3.角色的图片只存储一半,用的时候再翻转拼接,又进一步压缩了存储。

这些前人的智慧也对主流的游戏引擎有着深远影响:Sprite Atlas(精灵图集,以下统称SA)

不仅仅局限于以上描述的方面,SA甚至可以应用于2D 和 3D 项目中的 UI、粒子系统、贴图等等。

现在我们对SA进行一个详细的归纳总结:

SA的原理:

是一种将多张小图汇总,打包成为一个大图的技术。在游戏运行时只需要载入一张大图到内存便可以实现多个素材的载入,是一种优化性能的手段,减少多次DrawCall对性能的占用。

SA的优点:

将多个图片合并到一张大图中,减少多次DrawCall对性能的占用。

SA的缺点:

当不经常使用的素材被放到图集中时,即使改素材不被使用也会被载入内存,浪费了内存资源;并且图集的大小固定为长边的二次幂,如果图集内素材的大小差距过大,会直接造成储存的浪费。

前期要求:

首先我们先找到PackageManager,在Unity Registry中下载2D包。不然无法在项目中创建SA内容。


点击“install”,下载这个包

然后找到Project Setting选项>Editor>Sprite Atlas>Mode

Mode默认是Disabled,更改为Always Enabled,V1和V2两个版本目前没有很大的区别,选V1就行

其他两个选项的意思是:Enabled For Builds——在项目导出后应用图集,所以在编辑器里面看到的图集仍然是原来的那些图片。

为了保证项目能接近玩家原生感受选择Always Enabled。

SA的创建:

项目内右键Project>2D>Sprite Atlas创建SA。

这里如果没有前期准备的内容,就无法创建SA。

配置SA:

点击我们新创建的SA

解释一下该面板的几个重要内容的意义:

  1. Include in Build:是否在游戏发布后构建到游戏中
  2. Allow Rotation:是否允许旋转图片,如果勾选,在构建图集时可能会旋转对应的图片,建议禁用
  3. Tight Packing:选中可根据图片的轮廓而非默认矩形轮廓来打包精灵,让图片排列更紧密,建议禁用,否则UI元素在显示时可能会重叠显示其他的图片,因为在获取对应Sprite时是按矩形轮廓来获取的
  4. Padding:不同UI元素之间的间隔,单位为像素,避免图片之间过近导致显示出问题
  5. Objects for Packing:需要打包的UI元素,可以放文件夹或者单个图片,放文件夹可以将文件夹所有的图片打包进这个图集中,图片的格式需要设置为Sprite(2D and UI),一个图集最大的尺寸是2048*2048

以上为SA的使用方法以及原理当然还有其他的图集系统类似于Texture Atlas的内容,不过原理上也大同小异,下面我们深入的了解一下图集优化的内容。

前文提到了DrawCall,这里解释一下DrawCall的相关概念:

DrawCall是什么?

当我们在渲染一个物体时,需要通知GPU执行渲染的指令,这一过程叫做“DrawCall”。而调用DrawCall的次数越多,对GPU和CPU的性能开销就越大,本身电脑的性能就有限,因此我们便要减少DrawCall的次数,减轻对GPU的性能负担。所以开发者们就想到了上述类似Sprite Atlas的方法,以减少性能开销。

批处理是什么?

上面我们了解了Sprite Atlas的运行原理,而批处理便是该原理的名称;由于每一次DrawCall就可以大致理解为一个渲染批次(batch)。Draw call属于资源密集型的指令,图形API要为每个Draw call做大量的工作。造成CPU性能消耗的主要是渲染状态的切换导致的,例如切换到不同的材质,这会导致在图形驱动中产生密集的资源验证和切换。为了减少draw call的调用Unity引入了两种优化技巧:

  1. 动态批处理对于足够小的mesh,动态批处理通过将他们的顶点整合到一个批次中进行绘制。
  2. 静态批处理:通过将不会移动的静态物体合并到更大的mesh中,以提升渲染速度。

材质方面的要求

只有使用了相同材质的物体才能够实现批处理。如果两个不同的物体,使用的两个材质,只是纹理上的差别,那就把他们的纹理合并到一起,这样就可以使用同一个材质。脚本中使用Render.material属性时,会重新生成一个原来材质的拷贝,所以用Render.sharedMaterial可以保持材质的一致性(但是使用同一个材质的物体,都会被改变)。关于阴影,只要材质中使用的是相同的Shadow Pass,就可以实现批处理,即便他们不是同一个材质。

我们先了解一下UGUI系统的运行原理吧!

UGUI是在3D网格下建立起来的UI系统,它的每个元素都是通过3D模型网格的形式构建起来的。当UI系统被实例化时,首先要做的就是构建网格。【也就是说,Unity在制作一个图元,或者一个按钮,或者一个背景时,都会先构建一个方形网格,再将图片放入网格中。可以理解为构建了一个3D模型,用一个网格绑定一个材质球,材质球里存放要显示的图片。】

那么这里有一个问题界面上成千上万个元素就会拥有成千上万个材质球。如果GPU对每个材质球和网格都进行渲染,将会导致GPU的负担重大,怎么办呢?

UGUI对这种情况进行了优化,它

  1. 部分相同类型的图片集合起来合成一张图,
  2. 然后将拥有相同图片、相同着色器的材质球指向同一个材质球,
  3. 并且把分散开的模型网格合并起来,
  4. 这样就生成几个大网格和几个不同图集的材质球

以及少许整张的图集节省了很多材质球、图片、网格的渲染,UI系统的效率提升了很多,游戏在进行时也顺畅了许多。

这就是图集概念,它把很多张图片放置在一张图集上,使得大量的图片和材质球不需要重复绘制,只要改变模型顶点上的UV和颜色即可。

我们设想一下,如果每时每刻都在移动一个元素,那么UGUI系统就会不停地拆分合并网格,也就会不停地消耗CPU来使得画面保持应有的样子。这些合并和拆分的操作会消耗很多CPU,我们要尽一切可能节省CPU内存尽量把多余的CPU让给核心逻辑。UGUI系统在制作完成后,性能优劣差距很多时候都会出现在这里。

我们要如何想方设法合并更多的元素,减少重构网格的次数,以达到更少的性能开销目的呢?(UI优化)请阅读这篇文章啦

Unity—UI-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_63330263/article/details/136473724?spm=1001.2014.3001.5501本文成果由CSDN博主“Lyrissss_”与我共同创作

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

性能测试--线程的监控

1.线程的状态 1.1.线程的5种状态 java的线程总共有5种状态,如下: * 新建:new 【新建之后不启用都是new】* 运行:runnable* 等待:waitting(无限期等待),timed waitting(限期等待)* 阻塞:blocked* 结束&am…

C++ 求 f(x) = sin x / x 的函数极限

Python: import sympy from sympy import oo #注意无究符号表示形式为两个小定字母o import numpy as np x sympy.Symbol(x) #注意Symbol首字母大写f sympy.sin(x) / x # 定义极限表达式lim sympy.limit(f,x,oo) print(lim)输出: 0 C #include…

计网(部分在session学习章)

TCP/UDP TCP:面向连接,先三次握手建立连接,可靠传输。 UDP:无连接,不可靠,传递的快。 TCP可靠传输 1.分块编号传输; 2.校验和,校验首部和数据的检验和,检测数据在传输中的变化; 3.丢弃重复数据; 4.流量控制,TCP 利⽤滑动窗⼝实现流量控制。TCP的拥塞控制采⽤…

数据可视化第9天(利用wordcloud和jieba分析蝙蝠侠评论的关键字)

数据可以在这里下载 https://github.com/harkbox/DataAnalyseStudy WordCloud wordcloud可以很方便的生成词云图,方便的提供可视化可以直接使用pip install wordcloud进行安装如果使用的是Anaconda,可以使用conda install进行安装 下面看一个简单的例子 txt &qu…

在linux下的ROS中下载超级终端Terminator ROS开发得力助手

在一般我们运行机器人包时要打开三个终端来运行,关闭时还要一个一个关闭(ctrlc)过于麻烦 现在下载用了terminator后,就支持一键关闭多个终端了,很方便,具体操作如下: sudo apt install termin…

第十三期Big Demo Day聚焦Web3前沿,FaceN.AI项目路演揭幕创新技术

第十三期Big Demo Day活动即将于2024年5月28日在香港数码港的CyberArena隆重举行。FaceN.AI将亮相本次Big Demo Day,参与精彩的项目路演,展示其在跨链去中心化数字身份、On-chain to Off-chain数据应用、DIDFi探索以及元宇宙与AIGC人格化发展等领域的领先…

Gb 2024-05-22开源项目日报Top10

根据Github Trendings的统计,今日(2024-05-22统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3非开发语言项目2Jupyter Notebook项目2Rust项目2JavaScript项目1Lua项目1编程面试大学:成为软件工程师的全面学习计划 创建周期:2…

talib 安装

这里写自定义目录标题 talib 安装出错 talib 安装出错 https://github.com/cgohlke/talib-build/releases 这里找到轮子 直接装。

BUUCTF [GUET-CTF2019]zips 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。 密文: 得到一个attachment.zip文件 解题思路: 1、解压attachment.zip,得到222.zip文件。尝试解压需要密码,使用Ziperello爆破密码…

java连接ldap实现查询

文章目录 一、项目背景二、准备工作三、验证结果四、易错点讲解易错点1:java: 无法访问org.springframework.ldap.core.LdapTemplate易错点2:java: 无法访问org.springframework.context.ConfigurableApplicationContext易错点3:[LDAP: error…

WGCAT工单系统如何配置通知

WGCAT工单系统可以配置邮件通知 只要配置了邮件通知,那么一旦我们账号有新的工单需要处理,就会接受到邮件通知 除了邮件之外,还可以配置其他方式的通知,比如微信钉钉短信等方式,参考如下 https://www.wgstart.com/wgc…

RDD介绍

RDD设计背景 在实际应用中,存在许多迭代式计算,这些应用场景的共同之处是 : 不同计算阶段之间会重用中间结果,即一个阶段的输出结果会作为下一个阶段的输入. 而目前的MapReduce框架都是把中间结果写入到HDFS中,带来了大量的数据复制、磁盘IO和序列化开销; 如果能将结果保存在内…

Docker安装、入门及VSCode链接(地平线OE docker镜像)

最近在地平线的SDK X3上做开发,有高手做了一些编译方法的对比: [X3容器应用开发探索-0]开篇:从裸机编译到交叉编译 X86 Qemu for Hobot X3 PI(AARCH64) vs Hobot X3 PI 这里想借助Docker编译提速,做个笔记: 目录 一、…

算法刷题笔记 高精度乘法(C++实现)

文章目录 题目描述解题思路解题代码 题目描述 给定两个非负整数(不含前导0)A和B,请你计算 AB的值。 输入格式 共两行,第一行包含整数 A,第二行包含整数 B。 输出格式 共一行,包含AB的值。 数据范围 …

最新文章合集

GitHub宝藏项目:每天一个,让你的技术库增值不停! STORM、SuperMemory、Awesome Chinese LLM、AI写作助手、资料搜集、文章生成、视角问题引导、模拟对话策略、内容导入、浏览器插件、资源库、开源微调模型 开发者必看:Linux终端…

开关电源AC-DC(15W 3-18V可调)

简介: 该模块使用PI的TNY268PN电源芯片制作的开关电源,实现最大功率15W 3-18V可调输出(更改反馈电阻)隔离式反激电源; 简介:该模块使用PI的TNY268PN电源芯片制作的开关电源,实现最大功率15W 3-18V可调输出(更改反馈电阻,现电路图输出5V)隔离式反激电源; 一、产品简…

leecode 1206|跳表的设计

跳表 跳表,一种链表数据结构,其增删改茶的效率能和平衡树相媲美 leecode1206 可以看上面的那个动画,动画效果很贴切。 我简单讲讲它的机制吧,每个节点不单单是一个,测试好几层,然后同一层的节点和统一节点…

力扣96. 不同的二叉搜索树

Problem: 96. 不同的二叉搜索树 文章目录 题目描述思路复杂度Code 题目描述 思路 一个数字做根节点的话可能的结果为:其左边数字做子树的组合数字乘以其右边数字做子树的个数之积 1.创建备忘录memo; 2.递归分别求取当前数字左边和右边数字做子树的数量&…

Putty: 随心御剑——远程启动服务工具plink

一、引言:如何远程控制 也许你会有这样的场景,交互程序(以下简称UI程序)跑在windows端,而控制程序跑在Linux上。我们想要通过windows端 UI程序来启动Linux下面的服务,来一场酣畅淋漓的御剑飞行咋办,难道要自己十年磨一剑,在Linux下编写一个受控服务程序么.计算机科技发…

Stable Diffusion【艺术特效】【霓虹灯】:霓虹灯像素化马赛克特效

提示词 Neon pixelated mosaic of [Subject Description],highly detailed [主题]的霓虹灯像素化马赛克,高度详细 参数设置 大模型:万享XL_超写实摄影V8.2 采样器:Euler a 采样迭代步数:25 CFG:3 反向提示词&#x…