UGUI性能优化学习笔记(三)图片和图集

news2024/11/20 3:18:40

一、图片

1.1 纹理压缩

虽然我们可以将JPG、PNG之类的格式导入Unity作为纹理的源文件,但实际上,在导入Unity后,会自动对其进行纹理压缩。

为什么要进行纹理压缩?
每像素位数 (bpp) 表示单个纹理像素所需的存储量。bpp 值越低的纹理在磁盘和内存中也越小。较低的 bpp 值也意味着 GPU 使用较少的内存带宽来读取纹理像素。GPU 内存带宽通常是帧率的瓶颈,因此纹理压缩有助于避免这一问题。

既然要进行纹理压缩,JPG、PNG这类格式也拥有较高的压缩率,为什么不直接作为纹理呢?
这是因为这类格式不支持像素随机访问。GPU在进行渲染时,只使用需要的纹理部分,如果采用这种格式,在访问某个像素之前,就需要解码整张纹理。这就会造成严重的性能问题。

  • 安卓平台压缩格式
    在安卓平台下,官方建议设置压缩格式为ETC2或ETC。前者支持Alpha通道,且拥有更高的质量;后者不支持Alpha通道,要使用Alpha通道需要将纹理拆分为两个,一个用于RGB,一个用于Alpha。但是ETC支持比较旧的设备,且占用空间要小很多。

上图中带有“Crunched”字样的是Unity的二次压缩格式,即在ETC的基础上再次进行压缩。它可以使压缩后的图片占用体积更小,但相应的在运行时也需要进行二次解压。

  • IOS平台压缩格式
    IOS上的压缩格式官方推荐格式为ASTC或PVRTC。前者适用于较新的设备,后者则拥有更广泛的兼容性。

1.2 精灵的多边形模式

在图片的精灵模式中,有一个「Polygon」也就是多边形模式。

在多边形模式下,打开精灵的编辑窗口,选择「Custom Outline」模式,即可自定义精灵的网格。

最后需要在Image组件中开启「Use Sprite Mesh」选项

它的作用是允许我们自定义精灵的网格。对于一个透明背景的图片来说,如果采用默认的模式,其透明背景仍然会参与渲染,而且同样会造成Overdraw。

但如果我们自定义它的顶点,让网格更贴合非透明的部分,就可以减少可能产生Overdraw的面积。但代价是增加了顶点和边的数量。这就需要结合CPU和GPU的占用情况进行权衡。

1.3 关闭图片的读写和Mip Map

对于在UI中使用的图片,如果没有需求,建议关闭下面这两个选项

开启读写会导致在运行时将图片的一份拷贝加载到内存,从而造成资源的浪费。「Generate Mip Map」是用于在3D场景下,降低远处图片的渲染质量以提高性能,但对于UI来说并没有用处。而且开启这个选项会在运行时生成多个质量不一的图片加载到内存,同样会造成资源的浪费。

二、图集

2.1 为什么需要打图集

图集就是一种将多个纹理合并为一个组合纹理的资源。在之前学习优化的过程中我们了解到,决定UI元素能否合批的其中一个关键因素就是材质ID是否相同。假如每个UI元素都使用一张独立的材质,那么它们的材质ID是不同的,也就无法进行合批,最终导致UI产生大量的Draw Call。通过将这些材质打包成一张图集就可以很好地解决这个问题。

2.2 打包图集的方式

在「Edit -> Project Settings -> Editor -> Sprite Packer -> Mode」选项中,选择启用「Sprite Atlas V1」即可开启图集打包。

主图集

接下来在资源目录里创建一个图集「Create -> 2D -> Sprite Atlas」

这里的Type选择Master,表示这是一个主图集。然后将需要打包的图片添加到「Objects for Packing」中。然后点击「Pack Preview」按钮即可开始打包。效果如下

子图集

我们也可以将图集的Type设置为「Variant」,即子图集。它需要指定一个主图集,然后会继承主图集的所有属性。不过子图集可以设置「Scale」,可以用于不同分辨率下加载不同精度的图片。

我们可以在代码中通过如下方式加载图集中的图片

public SpriteAtlas atlas;
private void Start()
{
	// 参数填图集中对应图片的名称
	GetComponent<Image>().sprite = atlas.GetSprite("技能1");
}

2.3 图集的打包原则

  • 同一UI下的图片打进同一个图集
    因为在运行时加载图集中的图片时需要将整个图集载入内存,因此对于同一UI中的图片不应该跨多个图集。
  • 对于通用的图片可以单独打一个图集
    如果某些图片需要在多个UI中复用,可以单独打包到一个图集中。在运行时常驻内存,避免频繁加载。
  • 只将较小的图片打入图集

2.4 动态图集

下面来设想一个场景。场景中是一个装备商店,商店中有数十件装备,对应有数十张图片。按照我们打图集的策略,只要将这些图片打到一个图集中,即可大幅减少Draw Call。但假如玩家要在这些装备中选择几样带在身上,那么这张由几十张图片构成的大图集就需要驻留在内存中。显然,这会造成资源的浪费。如果不将这些图片打成一个图集,又会造成大量的Draw Call。一个比较合理的解决方法是使用动态图集。

所谓的动态图集就是在运行时动态打包图集。我们可以将玩家选择的几件装备的图片动态打成一个图集。这样既可以避免大量的Draw Call,又可以防止无意义的内存占用。

具体的动态图集使用方法可以参考:https://zhuanlan.zhihu.com/p/367679754

三、参考资料

[1]. https://zhuanlan.zhihu.com/p/391885850
[2]. https://zhuanlan.zhihu.com/p/237940807
[3]. https://blog.csdn.net/linxinfa/article/details/108827197
[4]. https://zhuanlan.zhihu.com/p/399537508
[5]. https://docs.unity3d.com/cn/2021.3/Manual/class-TextureImporterOverride.html

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

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

相关文章

简述供应链系统商品全生命周期管理价值,助力家用电器行业实现商品管理数字化

如今&#xff0c;随着数字化浪潮和消费升级叠加背景下&#xff0c;越来越多企业开始加速推进数字化的改造与升级&#xff0c;而家用电器行业作为我国经济发展不可或缺的中坚力量&#xff0c;现阶段许多家电企业的数字化管理水平还停留在初级阶段&#xff0c;难以适应变化多样的…

从弹性计算到数据处理——亚马逊云科技re:Invent

在2022亚马逊云科技re:Invent大会上&#xff0c;亚马逊云科技首席执行官Adam Selipsky说&#xff1a;“在今后的五年&#xff0c;我们创建了这些数据&#xff0c;可能会完全超过了数码时代一直到现在以来所有数据累加在一起的数量&#xff0c;这样同时也会告诉我们所有的组织都…

有哪些舆情监控方法,舆情监控工作机制?

一、舆情监控方法 1&#xff0c;组建新闻报道社会舆论舆情监控队伍 在言论高度自由的网络时代&#xff0c;人人都是自媒体&#xff0c;人人皆可表达意见。透过成立一队人才队伍的新闻报道社会舆论舆情监控各队能协助民营企业及时发现高度关注网络实时&#xff0c;迅速开展正面…

iphone13 ios 16.2降级15.6刷机教程

最近&#xff0c;更新了最新的ios16.2之后&#xff0c;系统经常出现卡屏卡死和异常耗电情况&#xff0c;最终决定对手机进行系统降级处理&#xff0c;下面是我的一个刷机过程。 目录 一、下载电脑版爱思助手 二、下载ios15.6版本固件 三、导入固件到爱思助手 四、刷机过程中…

Docker——自定义镜像

目录 一、镜像结构 二、Dockerfile 2.1 案例&#xff1a;基于Ubuntu镜像构建一个新镜像&#xff0c;运行一个java项目 2.1.1 新建文件夹docker-demo 2.1.2 拷贝docker-demo.jar到docker-demo 2.1.3 将jdk8.tar.gz文件放到docker-demo目录 2.1.4 将Dockerfile移动到docker-demo…

2023年IBDP大考计划安排

2023年5月IB考试时间已经公布。2023年5月IB考试时间表是以时区的不同分为A、B、C三个考区。具体安排如下&#xff1a; Zone A&#xff1a;UTC 12 至 UTC 3.5 Zone B&#xff1a;UTC 3 至 UTC 0 Zone C&#xff1a;UTC -1 至 UTC -10 中国属于东八区UTC8&#xff0c;属于Zone A考…

Linux学习:工程搭建

一、gcc main.c -o main 创建一个main.c文件 gedit main.c 在里边写进代码 #include <stdio.h>void main() {printf("hello world\n"); } 编译代码 gcc main.c -o main 输入ls&#xff0c;可以看到生成了一个可行性的main 执行main&#xff0c;即可执行…

2022年中科大分子生物学考试题、复习资料汇总(往年真题复习资料)

文章目录1.2022复习题2.2021复习题3.2020复习题4.2018复习题5.2015-2016复习题6.Key:复习重点7.随堂测验-平时成绩分子生物学复习资料及往年考题1.2022复习题 1.分子生物学复习资料及往年考题&#xff1a;&#xff08;已完结&#xff09; &#xff08;1&#xff09;资料完整版…

Tomcat的安装和运行

安装Tomcat 安装某一个软件,我们当然是要去官网.为了防止很多朋友找不到资源,我们这里直接放出官网路径. https://tomcat.apache.org/download-80.cgi 直接点击进入官网下载页面即可.选择Tomcat8,点击Core的zip包下载即可. 下载好以后,我们进入到下载的目录.选择到 我们下载…

js学习笔记

1.js代码要写在script标签中 <script type"text/javascript">for (let i0;i<5;i){document.write("<h1 stylecolor:red;>hello world</h1>")} </script>2.可以通过src的方式指定读取js文件进来&#xff0c;注意如果用这种方式…

[SECCON CTF 2022] crypto 部分复现

目录 janken vs kurenaif pqpq 以前写过了&#xff0c;官方方法一样 witches_symmetric_exam this is not lsb insufficient CVP BBB 当时仅pqpq差点完成&#xff0c;有个小错。其它都无从下手。终于看到wp一一试一下。原文 janken vs kurenaif 这个情况第一回见&#…

判断国际象棋棋盘中一个格子的颜色

题目链接 判断国际象棋棋盘中一个格子的颜色 题目描述 注意 coordinates.length 2‘a’ < coordinates[0] < ‘h’‘1’ < coordinates[1] < ‘8’ 解答思路 棋盘是不变的&#xff0c;只需要根据行列的奇偶性判断格子是否为白色即可 代码 方法一&#xff1…

爆火的OpenAi的ChatGPT聊天机器人注册和使用攻略

先来看看他的效果怎木样: 哇塞!是不是很奈斯!!! 一. 对OpenAi进行注册登录(需要翻墙) OpenAI APIAn API for accessing new AI models developed by OpenAIhttps://beta.openai.com/ 二. 购买一个虚拟号码用于手机号注册 nullReceive sms online on virtual numbers of SMS…

C2--Vivado开发环境之bit生成,文件组成,代码固化2022-12-08

1.FPGA的开发流程 Fpga代码的开发分为以下流程&#xff1a; 设计定义&#xff08;处于架构阶段&#xff0c;对需求进行定义&#xff0c;分析&#xff0c;模块划分&#xff09;设计输入&#xff08;verilog RTL代码输入、原理图&#xff09;功能仿真分析和综合&#xff08;由源…

真人踩过的坑,告诉你避免自动化测试入门常犯的10个错误

虽然从自己的错误中学习也不错&#xff0c;但从别人的错误中学习总是更好的。 作为一个自动化测试人员&#xff0c;分享常见的容易犯的10个错误&#xff0c;可以从中吸取教训&#xff0c;引以为鉴。 一、必要时才自动化 新人小王接到为Web应用程序自动化测试脚本的任务时&…

python服务调用-基于http的通信写协议(flask)-linux

服务器要部署一套算法, 我们的部署在该服务器上的数据平台需要调用 该算法进行一些操作, 要点主要两方面: 1.客户端发请求(同时传数据给服务). 2. 服务端的算法响应给请求,处理结束后,返回数据给客户端.这里一般第一次使用http协议的时候有点懵,其实是非常简单,我这里给了一个…

基于HTML+CSS+JavaScript “小味鲜“餐厅网页设计

基于HTMLCSSJavaScript "小味鲜"餐厅网页设计 每博一文案 师父说“生活中的负能大多来于圈子里的抱怨“&#xff0c;有时候&#xff0c;你不想做别人情绪的垃圾桶。 却不得不接受他们的吐槽&#xff0c;你嫌弃身边人无休止的抱怨&#xff0c;但又不知不觉被他们影响 …

12.感知机以及多层感知机(MLP),激活函数

x和w都是向量&#xff0c;b是标量&#xff0c;感知机的输出是&#xff1a;w和x做内积之后偏移b&#xff0c;最后加上一个函数&#xff08;这个函数很多种选择&#xff09;。 1. 训练感知机 如果当前是第i个样本&#xff0c;yi是真实标签值&#xff0c;<w,xi>b得到的是预测…

浅浅的分析Spring底层事务原理

Spring事务底层原理一、EnableTransactionManagement工作原理二、Spring事务基本执行原理三、Spring事务的过程四、Spring事务传播机制五、Spring事务传播机制分类&#xff08;1&#xff09;案例分析、情况1&#xff08;2&#xff09;案例分析、情况2&#xff08;3&#xff09;…

【正点原子FPGA连载】第三十二章OV5640摄像头RGB-LCD显示实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第三十二章OV564…