当前位置: 首页 > news >正文

第一章: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管理软件又是实现数字化管理的前提,机械设备管理软件对于企业来说就是关键一环。机械设备管理软件如何选择&#xff1f…...

深入浅出带你学习shiro-550漏洞

//发点去年存货 前言 apache shiro是一个java安全框架,作用是提供身份验证,Apache Shiro框架提供了一个Rememberme的功能,存储在cookie里面的Key里面,攻击者可以使用Shiro的默认密钥构造恶意序列化对象进行编码来伪造用户的 Cookie&#xf…...

项目(今日指数之环境搭建)

一 项目架构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)))]minG​maxD​V(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,通用异步收发传输器。 一、工作原理 和其它串口一样,数据按照二进制从低位到高位一位一位的传输,能将要传输的数据在串行通信与并行通信之间加以转换,能够灵活地与外部设备进…...

80 90后表示真干不过,部门新来的00后已经把我卷奔溃了,不想干了····

都说00后躺平了,但是有一说一,该卷的还是卷。这不,刚开年我们公司来了个00后,工作没两年,跳槽到我们公司起薪18K,都快接近我了。 后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 …...

Python中2.x 与 3​​.x 版本区别?

Python 的 3​​.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。 为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下相容。 许多针对早期 Python 版本设计的程式都无法在 P…...

性能指南笔记一

全面的性能 1.好处和效率之间的权衡在增加程序特性的过程 2.数据库永远是瓶颈,分布式系统的整体性能问题 我们当前的性能处于什么百分位? 是不是整体的性能属于下降的? 一开始就考虑可能性很小的性能问题? 3.吞吐量测试 TPS 每秒…...

es数据导入导出

使用elasticdump导入导出数据 一、安装elasticdump 终端中输入 1 npm install elasticdump -g -g表示全局可用,直接在终端输入 elasticdump --version,出现版本信息即表示安装成功,如下 1 2 C:\Users\T470s>elasticdump --version 6.3.3 …...

Python3入门教程||Python3 字符串||Python3 列表

Python3 字符串字符串(string,简写为str)是 Python 中最常用的数据类型之一。我们可以使用引号( 或 " )来创建字符串。创建字符串很简单,只要为变量分配一个值即可。例如:var1 Hello World!var2 "W3Cscho…...

API 的安全性

大家好。今天聊一个很重要但是大部分人不重视的API安全问题。api固有的范围和风险意味着它们需要一种不同的安全方法。应用程序编程接口(api)是现代应用程序的构建模块,它们的使用正在以惊人的速度增长。然而,随着使用的增加,风险也会增加。。…...

Linux驱动->设备树

1.定义 设备树(device tree是描述硬件信息的一种树形结构,设备书文件在linux内核启动后被内核解析。描述一个硬件设备信息的节点我们叫做设备节点,一个设备节点内部包含当前硬件的多个不同属性,相同节点不同 2.设备树的文件格式…...

一天一道力扣题

232. 用栈实现队列请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek()…...

算法leetcode|36. 有效的数独(rust重拳出击)

文章目录36. 有效的数独:样例 1:样例 2:提示:分析:题解:rustgoccpythonjava36. 有效的数独: 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效…...

都说爱有回音,这次情人节驱动人生宠你!

来了来了,它又来了——那个一波人狂欢,一波人孤单的节日。 眼看着身边人在订花订餐厅,选礼物,空气中弥漫着微妙的氛围,驱动哥脑海里只有明天下班的地铁挤不挤得过这群约会的人。 不过根据哥的观察,发现一个…...

做传媒网站公司/帮人推广注册app的平台

文章目录 前言 网站访问流程(故事版) 如何排查问题 如果客户说访问web网站慢 如果你访问网站发现的确访问速度很慢,这时候你需要排查网站慢的原因 1) 检查网站服务器是否异常 2) 检查与网站相关联的服务是否异常 3&…...

怎么做搜索网站/百度推广天天打骚扰电话

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放,树高千尺,落叶归根人生不易,人间真情 前言 本章Linuxshell讲解,感谢观看,干货满满。 目录…...

做农家乐网站/公司的seo是什么意思

命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。 命令模式包含如下角色: Command(抽象命令类):一般是一个接口&am…...

销售网站怎么做的/优化系统软件

select *from emp where months_between(sysdate,hhiredate与当前时间差距超过25年,月份/12表示一年 sysdate为当前日期 months_between(sysdate,hiredate)计算当前日期 - hiredate 的月份 months_between(sysdate,hiredate)/12计算当前日期 - hiredate 的年数 mont…...

天津协会网站建设/网络营销推广方式包括

2019独角兽企业重金招聘Python工程师标准>>> API 包含了两个软件包,十二个接口和九个类。 软件包: javax.servlet 软件包: javax.servlet 所包含的接口:RequestDispatcher;Servlet;ServletConf…...

网站做定向的作用/网络营销主要做些什么

耳机逐渐成为了我们生活中不可缺少的一样电子设备,可以说是走到哪带到哪,特别是无线蓝牙耳机,摆脱了繁琐的线缆,对于经常出行的人来说确实是非常方便。而相比起真无线耳机,“挂颈式”的设计又来个更加方便使用&#xf…...