第一章:unity性能优化之内存优化
目录
前言
unity性能优化之内存的优化
一、unity Analysis工具的使用。
二、内存优化方法
1、设置和压缩图片
2、图片格式
3、动画文件
4、模型
5、RenderTexture(RT)
6、分辨率
7、资源的重复利用
8、shader优化
9、对bundle进行良好的管理
10、巧用静态合批
11、关注代码对象所占内存
·12、音频
13、字体裁剪
总结:
前言
在unity项目实际开发中,总是逃不开对于项目进行优化,内存、GC,渲染效率(GPU、drawcall)、发烫耗电等问题往往是对技术的最基本的技术考验,同时又有实际程序员的个体差异,结果往往各不相同。
作为技术通常从技术角度考虑问题,将一个好好的游戏优化成一个白模游戏,会说:“你看,我在技术上是达标,是你的资源太复杂了”;作为有责任心的制作人或者美术负责人就会说:“我做的东西效果好的很,到游戏里怎么成这个样子了。”技术会要求美术资源问题,要么重做,要么大面积修改。作为有骨气的美术通常带着怨气不予理睬,这样的结果可想而知,项目就无法做下去。
该篇我不仅仅从技术的角度来讲解unity 项目如何优化,同时也从其他方面作出阐述。因为我们最终的目的是将项目做成大家都想要的效果,而不是理想的认为做出仅仅是我想要的东西。
由于篇幅原因,本文仅从内存方面如何优化。
unity性能优化之内存的优化
不管硬件如何发展,内存永远满足不了程序员对更大内存的渴望,也无法杜绝个别不靠谱的程序员所写出来的泄露的Bug,所以控制我们程序所用得内存至关重要。在此讲解方法之前,需要了解unity Analysis工具的使用。
一、unity Analysis工具的使用。
不同的unity版本可能有个体差异,但是基本相同,我就以2021.3.2f1版本为例:
找到菜单栏中window->Analysis->Profiler
点击并进入分析器 ->获取内存快照 take sample

这样我们就可以看到textere2D列表下图片所占用的内存(memory)以及被图片被引用的次数(refcount)。再详细的如何使用就不再做赘述了。
二、内存优化方法
在unity项目中,控制内存的方法大致有如下方法:
1、设置和压缩图片
如果一张图片格式是RGBA,1024*1024大小的图片是4M,如果改成512*512那么就是1M,可以看出图片的大小对于内存的影响是多大。
在unity项目中,我们通常设定的规则是尽可能不要设置操作1024*1024大小,对于通用的图片(如共用的界面图集、光照贴图,模型贴图等)。图片大小原则是就小不就大,能使用小图的尽可能使用小尺寸图片。一般来讲移动端的最大尺寸最高限定在2048*2048,除个别UI图集,其他的应该都要在1024*1024以下。
图片过大尺寸会造成以下问题:
1)加载单张图片需要的是连续大小的内存,因无法找到足够大小的连续内存而造成闪退或程序异常问题
2)部分机型不支持该尺寸而造成异常
在unity中我们可以根据不同平台选择图片大小

在图片inspector面板中,我们看到图片在该平台下实际大小为4096*4096,这远远超过我们设定的标准,应该叫美术小伙伴进行修改。
我们还可以对图片尺寸做最大的限制,当然最好不要这么做,因为这不是常规操作。

2、图片格式
同样,决定纹理所占内存大小的还有格式,我们应该根据实际情况选择我们想要的格式

对于不同平台我们应该选定不同的格式:
android应该尽可能选择ETC(不带透明通道的)或ECT2(带透明通道的)
IOS平台应该选择astc或pvrtc格式,根据质量需要选定具体压缩比率。当然对于ASTC格式安卓和IOS都是支持的,具体压缩格式就不在该文章中表述了。
pc根据实际需要选择能选择DXT格式或BC7格式。
格式相关详细信息,参考各平台的推荐、默认和支持的纹理压缩格式 - Unity 手册 (unity3d.com)
在Texture Inspector面板中有一个minmap 选项
minmap勾选,会让我们多出1/3左右的内存,但是minmap有时也有及其的好处
减少摩尔纹和闪烁,同时可以减少GPU的带宽需求。所以要根据实际情况而定。

3、动画文件
1)减少动画文件浮点数的精度
动画.anim)文件往往也是内存的重灾区,我们用文本编辑器软件打开发现,它的格式如下;

内容中有大量的精度9位的数据,在一般情况损失一定的精度对动作的影响并不大,实际项目中我一般选定保留三位精度。
注意:降低精度有可能造成模型的个别动作不连贯,需要排查。
2)减少不必要的动画帧数
在不影响效果的情况,需要美术配合减少动画的帧数。实际项目中,我们设定帧数在30
帧。
4、模型
1)减少面数
一个高精度模型有时有几万三角面,可能就有几M,通过美术减面的方式,这是最直接,但是以有时候因为减面引起美术效果不达标问题,或者锯齿严重,这时应该需要技术或者技术美术提高技术工艺等手段。
做过二次元的小伙伴就知道,锯齿是美感的杀手。近几年比较流行的本村线的分UV的方法,能在面数相对少的情况下锯齿效果改善很多。
2)模型insepctor选项中read/write选项

对于模型而言,Unity对于这个选项默认开启。
当项目会在运行过程中通过代码修改Mesh,或者Mesh被用来作为MeshCollider组件的基础时,Unity要求这个属性必须开启。如果模型没有用到MeshCollider中或者不需要通过代码修改,将这个属性改成false可以节省一半的内存资源。
2)模型insepctor面板中mesh Compression
mesh Compression 是对unity自动对模型压缩的选项,可以根据实际情况而定选择Low,medium,high等压缩质量。模型约low,顶点数就少,那么占用内存自然就越少。

5、RenderTexture(RT)
对于RT文件的使用,我们可能不可避免。但是RT文件的特殊属性,通常是RGBA类型,所以在使用的时候我们应该坚持够用就行,尽可能满足需求的同时少用。考虑缓存的方式,不要频繁创建,以免需要申请连续内存失败造成程序奔溃问题。
6、分辨率
根据实际情况和渲染效果设置分辨率,调用 Screen.SetResolution(newWidth, height, true);接口,可以按照、低-中-高等配置设置。分辨率的设置,影响的不仅仅是内存,同时对于渲染也有很多大的影响。
7、资源的重复利用
在场景中,如MMORPG或者街道场景,对3D 模型的重复利用也能减少内存。
8、shader优化
1)standard shader
默认的unity standard PBR Shader由于其变体非常多,当打包编译的时候,Shader文件文件实体非常大,大概近100M的内存空间。应该不要使用unity standdard shader或者默认的粒子shader。有时候可能发现自己并没有使用standard Shader,什么通过UWA或连接手机在unity编辑器的分析列表中还是存在引用呢?

这是因为如果倒入模型时没有指定shader,那么系统会自动给一个默认的standard材质,所以在导入模型的时候,要查看材质列表是否为空,如图:

我们可以Editor模式下的代码钩子,定义一个类继承AssetPostprocessor类来做监听模型导入时的ModelImporter设置材质信息。
9、对bundle进行良好的管理
好的bundle的管理应该不仅仅是管理Bundle本身的加载和卸载,同时也要考虑资源的命中率,考虑在何时真正卸载该资源或永久缓存该资源。
缓存是个好东西,有的程序为了游戏流畅,将很多资源预先加载到内存中,请切记,考虑流畅的同时也要考虑内存使用情况。
同时,对于bundle的分割也很关键,它的颗粒是多大,怎么分就很关键了。
如我们的游戏有主城和战斗场景,主城是不参与战斗的,只有闲人、人物NPC、剧情表演等,那么在主城就不需要加载角色的技能动作
如果是mmorpg,角色会频繁进入我们的视野,我们可以把技能动作和基础的跑动等动作分开在不同的bundle中,而不是打在一个bundle中。因为战斗动作可能并不需要,因为在你的视野后,对方一会就传送到其他地图了。
10、巧用静态合批
静态合批(将场景的物件设置为static)减少Drawcall 有比较好的效果,相对也比较简单。实际发现静态合批的实际会生成一个个合并的模型,所以在实际运用中,有两份模型内存

那么我们如何选择静态合批呢?
我们应该遵循这样的一个原则,如果该物件重复物件比较多、不需要移动的,并且比较小的物件,如:城市的垃圾桶模型,路灯等模型,我们可以选择静态。不重复的、面数多的就不需要将它设定为static 物件。
11、关注代码对象所占内存
UWA和腾讯的wetest等unity性能分析软件可以分析哪些代码对象占用内存比较多,我们可以根据分析的结果做判断,并一一排查。
·12、音频
对于音频文件,一个2M的文件可能在内存中解压后占用内存20M

1)建议启用Force to Mono(强制改成单声道)
为什么建议通过勾选Force To Mono来优化音频呢?
被建议的音频是双声道音频,且左右两声道的音乐完全相同,可以用勾选ForceToMono的方式强制将此音频修改为单声道,内容不丢失的情况下可以减少它的使用内存和大小。特别是在移动平台下几乎听不出任何区别。如果左右声道内容不同,开启ForceToMono会导致听到的声音错误。
2)选择正确的压缩格式(Compression format)
一般情况下,应该尽可能使用未压缩的wav文件作为音频源文件,通过不同平台支持的压缩格式控制压缩比。一般移动平台下,unity下大多数音频文件采用Vorbis压缩方法。如果音乐不循环可以使用MP3格式。一些操作系统对特定的压缩格式有额外的优化,比如在iOS系统上可以使用MP3格式。此外一些简短常用的音效可以使用ADPCM格式。虽然这种格式的压缩比可能不是最好的,但在播放过程中解码速度很快。总之,音频压缩策略需要考虑不同压缩格式在不同平台下的特点,以及音乐音效文件在不同用途下使用不同的压缩格式。
3) 重新 采样率( override Sample Rate)

根据实际需要选择采样的率,来降低内存。
13、字体裁剪
Unity使用的都是默认的Arial动态字体,这字体是微软系统自带的一个字体库,它的大小可能十几MB左右,在一般情况下是可以忽略它的大小,但是如果是手机游戏,微信小游戏这一类对安装包有极大要求的游戏,就需要减少安装包的大小,而字体就好比一个仓库,默认情况下他会把所有的文字都包含在库里,可实际上游戏开发时,大部分的文字我们并没有用到,但是Unity会把这些字体跟着安装包一块打包导出,这无形增加了安装包的大小,为此我们需要对字体进行优化也就是“裁剪”“。
字体的裁剪可以通过FontSubsetGUI,、FontCreator这两个软件,具体怎么使用大家到网上搜索即可,这里只抛砖引玉。
总结:
降低内存的同时,我们有时候会带来其它负面印象。比如:选择音频的压缩格式时,有可能我们带来失真效果;过多的静态合批Static场景物件会造成内存过多,不静态合批static场景物件,有可能渲染压力比较大,drawcall过多。
所以在实际运用中,优化方法是固定的,但是也要根据实际情况取其利弊关系。不能一概而论。由于编辑器和真机环境下有时会有截然不同的结果,要借用一些测试工具,UWA和wetest就非常好用,具体就不作赘述。
相关文章:
第一章:unity性能优化之内存优化
目录 前言 unity性能优化之内存的优化 一、unity Analysis工具的使用。 二、内存优化方法 1、设置和压缩图片 2、图片格式 3、动画文件 4、模型 5、RenderTexture(RT) 6、分辨率 7、资源的重复利用 8、shader优化 9、对bundle进行良好的管…...
2023年家族办公室研究报告
第一章 概况 家族办公室最早起源于古罗马时期的大“Domus”(家族主管)以及中世纪时期的大“Domo”(总管家)。现代意义上的家族办公室出现于19世纪中叶,一些抓住产业革命机会的大亨将金融专家、法律专家和财务专家集合…...
Typescript快速入门
Typescript快速入门第一章 快速入门0、TypeScript简介1、TypeScript 开发环境搭建2、基本类型3、编译选项4、webpack5、Babel第二章:面向对象0、面向对象简介1、类(class)2、面向对象的特点3、接口(Interface)4、泛型&…...
如何激励你的内容团队产出更好的创意
对于一个品牌而言,如何创造吸引受众并对受众有价值内容是十分关键的。随着市场数字化的推进,优质的创意和内容输出对一个品牌在市场中有着深远的影响。对于很多内容策划和创作者来说,不断地产出高质量有创意的内容是一件非常有挑战性的事情。…...
机械设备管理软件如何选择?机械设备管理软件哪家好?
随着信息化技术的进步与智能制造的发展趋势,很多机械设备制造企业也在一直探寻适合自己的数字化管理转型之路,而企业上ERP管理软件又是实现数字化管理的前提,机械设备管理软件对于企业来说就是关键一环。机械设备管理软件如何选择?…...
深入浅出带你学习shiro-550漏洞
//发点去年存货 前言 apache shiro是一个java安全框架,作用是提供身份验证,Apache Shiro框架提供了一个Rememberme的功能,存储在cookie里面的Key里面,攻击者可以使用Shiro的默认密钥构造恶意序列化对象进行编码来伪造用户的 Cookie…...
项目(今日指数之环境搭建)
一 项目架构1.1 今日指数技术选型【1】前端技术【2】后端技术栈【3】整体概览1.2 核心业务介绍【1】业务结构预览【2】业务结构预览1.定时任务调度服务XXL-JOB通过RestTemplate多线程动态拉去股票接口数据,刷入数据库; 2.国内指数服务 3.板块指数服务 4.…...
PCL 基于投影点密度的建筑物立面提取
目录 一、算法原理1、投影密度理论及方法2、参考文献二、代码实现三、结果展示一、算法原理 1、投影密度理论及方法 将3维坐标点直接垂直投影到水平面上或者将 Z Z Z 值取任意常数,统计和计算水平面任意位置处所含投影点的个数记为...
DDD 参考工程架构
1 背景 不同团队落地DDD所采取的应用架构风格可能不同,并没有统一的、标准的DDD工程架构。有些团队可能遵循经典的DDD四层架构,或改进的DDD四层架构,有些团队可能综合考虑分层架构、整洁架构、六边形架构等多种架构风格,有些在实…...
重建,是2023年的关键词
作者:俞敏洪 来源:老俞闲话(ID:laoyuxianhua) 01 重建,是2023年的关键词 1.重建,是2023年的关键词 2023年,以一种奇特的方式来临。 之所以说奇特,是因为我们谁都没有…...
动手写操作系统-00-环境搭建以及资料收集
文章目录 动手写操作系统内核目标编本教程适合什么样的人?一些简单的要求操作系统的功能环境搭建参考文档:动手写操作系统内核 一直以来想学习linux操作系统,读了很多关于操作系统的书籍,也想自己动手写个OS 目标编 编写一个操作系统内核;能正常的运行自己编写的OS本教程适合…...
【scipy.sparse包】Python稀疏矩阵详解
【scipy.sparse包】Python稀疏矩阵 文章目录【scipy.sparse包】Python稀疏矩阵1. 前言2. 导入包3. 稀疏矩阵总览4. 稀疏矩阵详细介绍4.1 coo_matrix4.2 dok_matrix4.3 lil_matrix4.4 dia_matrix4.5 csc_matrix & csr_matrix4.6 bsr_matrix5. 稀疏矩阵的存取5.1 用save_npz保…...
从写下第1个脚本到年薪30W,我的自动化测试心路历程
我希望我的故事能够激励现在的软件测试人,尤其是还坚持在做“点点点”的测试人。 你可能会有疑问:“我也能做到这一点的可能性有多大?”因此,我会尽量把自己做决定和思考的过程讲得更具体一些,并尽量体现更多细节。 …...
JAVA八股、JAVA面经
还有三天面一个JAVA软件开发岗,之前完全没学过JAVA,整理一些面经...... 大佬整理的:Java面试必备八股文_-半度的博客-CSDN博客 另JAVA学习资料:Java | CS-Notes Java 基础Java 容器Java 并发Java 虚拟机Java IO目录 int和Inte…...
GAN系列基础知识
原始值函数 原始GAN的值函数是 minGmaxDV(D,G)Ex∼pdata(x)[logD(x)]Ez∼pz(z)[log(1−D(G(z)))]min_Gmax_DV(D,G) E_{x \sim p_{data}(x)}[logD(x)]E_{z \sim p_{z}(z)} [log(1-D(G(z)))]minGmaxDV(D,G)Ex∼pdata(x)[logD(x)]Ez∼pz(z)[log(1−D(G(z)))] 其中Ex…...
Linux/CenterOS 7.9配置汉化gitlab服务器
1.安装gitlab的依赖项 yum install -y curl openssh-server openssh-clients postfix cronie policycoreutils-python2.启动postfix,并设置为开机启动 systemctl start postfixsystemctl enable postfix3.防火墙和selinux的设置 setenforce 0systemctl stop fire…...
山洪灾害监测预警平台 山洪灾害监测预警系统解决方案 以人为本 科学防御
平升电子山洪灾害监测预警平台 山洪灾害监测预警系统解决方案,集信息采集、传输、分析和预警等功能于一体,实现预警信息及时、准确地上传下达,提升监测预警能力,使可能受灾区域能够及时采取措施,最大程度减少人员伤亡和…...
The Number Of ThreadPoolExecutor
序言整理下Java 线程池中线程数量如何设置的依据巨人肩膀:https://blog.csdn.net/weilaizhixing007/article/details/125955693https://blog.csdn.net/yuyan_jia/article/details/120298564#:~:text%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E6%B1%A0%E5%A4%84%E7%90%86%E8%AE%A1,…...
Linux(Linux各目录结构详解)
我们知道Linux系统是一个文件系统,它的文件系统就类似windows系统下的磁盘文件系统。 我们连接上一台linux系统的服务器。 输入命令 : ls / 我们可以看到 linux系统的根目录下有这些目录 bin boot data dev etc hbr home lib lib64 lostfoun…...
UART通讯简介
UART全称Universal AsynchronousReceiver/Transmitter,通用异步收发传输器。 一、工作原理 和其它串口一样,数据按照二进制从低位到高位一位一位的传输,能将要传输的数据在串行通信与并行通信之间加以转换,能够灵活地与外部设备进…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
