Unity 性能优化二:内存问题

news2024/9/27 9:24:47

目录

策略导致的内存问题

GFX内存

纹理资源

压缩格式

Mipmap

网格资源

Read/Write

顶点数据

骨骼

静态合批

Shader资源

Reserved Memory

RenderTexture

动画资源

音频资源 

字体资源

粒子系统资源

Mono堆内存


策略导致的内存问题

1. Assetbundle 打包的时候,单个资源被重复打包,可以把依赖的资源,单个打包,通过AssetBundleBrowser 可以查看Assetbundle里面的资源情况,地址:Unity Technologies · GitHub

2. 代码使用不当,资源加载后没有及时销毁,比如:

            var gos = Resources.Load<GameObject>("Sphere");
            GameObject go = Instantiate(gos);
            Material ma = go.GetComponent<Renderer>().material;
            ma.color = new Color(1, 0.5f, 0.5f);
            
            //Destroy(ma);
            Destroy(go);

 在内存里面还是会存在一份material,因为每次设置color的时候,都是创建了一个新的material

3. Assetbundle 的卸载不当,导致资源冗余,Unload(false),会把加载的assetbundle 卸载,但从里面加载的资源还在,Unload(true),都会卸载

GFX内存

GFX内存(Graphics)是指图形处理器(GPU)的专用内存,用于存储图形数据和计算所需的临时数据。

纹理资源

压缩格式

1. 图片在导入unity的时候,会转换成unity识别的的格式,比如jpg,png,这些是在硬盘上存储的格式,但不能不GPU直接读取,所以导入的时候会转换成ETC、ASTC 格式

2. 图片压缩的好处:

减少占用内存、减少带宽、减少加载时间

3. 如果图片的压缩格式,在该平台上不支持,会转换成RGBA格式,即不压缩

4. Android支持ETC/ASTC; IOS 支持 ASTC/PVRTC; PC 支持DTX

5. ASTC 可以调节压缩块的大小,来调节压缩比例,因为ASTC 是以固定128bit 来存储一个块的,块里面的像素越多,压缩比例就越大,因为平摊到每个像素的存储空间越少,比如4x4,6x6,8x8

Mipmap

1. mipmap 的好处及坏处

好处:减少带宽  坏处:增加内存

2. 原理

存储的图片内存是等比数列,1、1/4、1/16......,内存和是原来的4/3倍,也就是内存增加了1/3

3. 对于2D 界面,因为摄像机距离不会发生变化,所以要关闭mipmap,3D 物体或UI可以根据情况开启Mipmap

4. 通过Texture Quality 改变加到到内存的Mipmap的数量,从而实现不同性能的机器,配置不一样

通过Edit-Project Settings-Quality--Textures修改,只对开启了Mipmap的纹理生效,里面的FullRes、HalfRes 等内存依次降低为原来的1/4

5. Texture Streamming 动态改变加载到内存的Mipmap的数量

只对动态加载的Mipmap纹理有效,比如assetbundle加载,如果场景已经存在该纹理,且通过加载场景的方式加载,Texture Streamming则不会生效,因为纹理已经存在了,无法动态改变

纹理加载会根据物体和摄像机的位置,动态实时的去ab包内加载Mipmap

生效条件:纹理开启texture streaming 和 generate Mipmap

MaxLevelReduction(最多裁剪的层级) 的优先级>Memroy Budget (mipmap 占用的最大内存)

网格资源

Read/Write

CPU和CPU会各占一份内存,如果不需要在代码中修改mesh,就不要开启该选项

顶点数据

一份网格的顶点数据有很多,比如position、color、tangent等,但是切线一般是在计算光照的时候才用,可以在导入模型的时候,model 栏下,设置tangent为none,也可以通过projectsetting里面开启optimize mesh data,它会裁剪没有用到的顶点属性,需要测试

骨骼

如果模型不需要骨骼数据,则在模型导入的RIG栏,设置animation type为none

静态合批

会增加内存,空间换时间

Shader资源

1. shader占用的内存,只要是shader变体,每一个变体都会产生一个shader,加载到内存里面

2. 游戏初始化的时候一般需要提前把渲染要使用的Shader全部都加载进来,以降低游戏运行时及时加载和编译带来的卡顿,这时候我们可以调用Shader.WarmupAllShaders来把当前已经加载到内存的Shader全部编译一次,包含所有的变体。

3. 随着项目渲染效果的丰富,Shader变体变得越来越多,粗暴的调用全加载接口,会导致游戏的启动时间变得更长,影响游戏体验。

4. 后来Unity加入了变体集合ShaderVariantCollection来取代上面的粗暴全加载接口,达到按需加载,提高加载速度

5. 优化方向:裁剪shader变体

地址:https://answer.uwa4d.com/question/5da86670e84db43d6efbda72
 

Reserved Memory

RenderTexture

适当关闭抗锯齿,或者降低抗锯齿的质量、减少阴影贴图的质量,即分辨率、降低RT的存储位数(代码生成的时候设置),HDR如果不使用alpha通道的情况,可以修改格式为R11G11B10,即32为存储格式

动画资源

1. 勾选Resample Code,在模型导入的animation栏中,默认开启,它会减少关键帧的数量

2. 压缩animation

3. 骨骼动画,不用scale,剔除不用的scale曲线,通过编辑器代码,AnimationUtility

4. 降低动画存储的float精度,从而使其存储方式为constant,减少内存

5. 选中animation,可以在属性面板看到其详细信息

音频资源 

1. ForceToMono:把双声道音频合并成单声道

2. LoadType: 

Decompress On Load:加载后,解压缩,以未压缩的方式存储在内存上

Compress in memory:以压缩方式存储在内存上,播放时解压缩

Stream:边解压缩边播放,但是每播放一次都会增加一份缓存

对于不经常播放的,长而大的背景音乐,用stream,对于短且频繁用第一种(抢声)、其它中等音乐用第二种

3.压缩格式

压缩率越小,压缩后占用的文件内存越小,ADPCM压缩格式,占用内存最小,配合Compress in memory使用
PCM:不压缩、Mp3:次之、Vorbis:更次之、ADPCM:最小

字体资源

1. 字体瘦身:有些字体不使用,可以裁剪掉,工具推荐:FontSubsetGUI、FontPruner

2. 字体压缩:TMP 生成的字体问题太大,不能改变,通过提取其纹理,然后压缩,再赋值的方式,压缩纹理

粒子系统资源

1. 粒子占用的内存和实际播放的粒子数有关,和最大粒子数无关

2. 如果粒子没播放,也会占用一部分内存,比如:粒子系统只是被关闭了,没删除

Mono堆内存

1. 常驻内存过高:比如list、dictionary、数组,初始化时的内存不要过高

2. 持续分配内存:每一万帧,分配不超过50M,通过在初始化时缓存变量






 


 

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

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

相关文章

【C++】C++ STL标准模板库知识点总结(秋招篇)

文章目录 前言STL的六大组件是&#xff1f;容器(container) 算法(algorithm) 迭代器(iterator) 三者的关系&#xff1f;容器分为几种&#xff1f;分别有哪些&#xff1f;关联性容器和非关联性容器有什么区别&#xff1f;Vector容器是怎么调整大小的&#xff1f;&#xff08;内存…

VirtualEnv 20.24.0 发布

导读VirtualEnv 20.24.0 现已发布&#xff0c;VirtualEnv 用于在一台机器上创建多个独立的 Python 运行环境&#xff0c;可隔离项目之间的第三方包依赖&#xff0c;为部署应用提供方便&#xff0c;把开发环境的虚拟环境打包到生产环境即可&#xff0c;不需要在服务器上再折腾一…

RAM明明断电会丢失数据,为什么初始化的全局变量存储在RAM?详细分析程序的存储

前言 &#xff08;1&#xff09;之前因为一个字符指针和字符数组指针引发的bug&#xff0c;折磨了我一个下午才发现问题。之后我就打算研究一下系统是如何发现野指针乱访问问题。后面就一直深入到微机系统中的内存管理了。 &#xff08;2&#xff09;这些其实都是基础知识&…

SpringBoot房屋租赁系统【附ppt|万字文档(LW)和搭建文档】

主要功能 前台登录&#xff1a; ①首页&#xff1a;公告信息、房屋信息展示、查看更多等 ②房屋信息、房屋类型、我要当房主、公告信息、留言反馈等 ③个人中心&#xff1a;可以查看自己的信息、更新图片、更新信息、退出登录、我的收藏 后台登录&#xff1a; ①首页、个人中心…

Day 69-70:矩阵分解

代码&#xff1a; package dl;import java.io.*; import java.util.Random;/** Matrix factorization for recommender systems.*/public class MatrixFactorization {/*** Used to generate random numbers.*/Random rand new Random();/*** Number of users.*/int numUsers…

使用贝叶斯算法完成文档分类问题

贝叶斯原理 贝叶斯原理&#xff08;Bayes theorem&#xff09;是一种用于计算条件概率的数学公式。它是以18世纪英国数学家托马斯贝叶斯&#xff08;Thomas Bayes&#xff09;的名字命名的。贝叶斯原理表达了在已知某个事件发生的情况下&#xff0c;另一个事件发生的概率。具体…

【Golang系统开发】搜索引擎(1) 如何快速判断网页是否已经被爬取

文章目录 1. 写在前面2. 数组存储3. 位图存储3.1 位图简介3.2 链表法3.3 开放寻址法 1. 写在前面 在实际工作中&#xff0c;我们经常需要判断一个对象是否存在&#xff0c;比如判断用户注册登陆时候&#xff0c;需要判断用户是否存在&#xff0c;再比如搜索引擎中的爬虫&#x…

大数据面试题之Elasticsearch:每日三题(七)

大数据面试题之Elasticsearch:每日三题 1.Elasticsearch索引文档的流程&#xff1f;2.Elasticsearch更新和删除文档的流程&#xff1f;3.Elasticsearch搜索的流程&#xff1f; 1.Elasticsearch索引文档的流程&#xff1f; 协调节点默认使用文档ID参与计算(也支持通过routing)&a…

【UE4】给角色添加脚步声

步骤&#xff1a; 1. 导入一个脚步声音频文件&#xff08;.wav格式&#xff09; 2. 打开角色蓝图&#xff0c;这里以第三人称角色模板蓝图“ThirdPersonCharacter”为例&#xff0c;在事件图表中添加一个生成音效的自定义事件。 3. 打开动画序列“ThirdPersonRun” 找到小白人…

Python编程——while循环嵌套讲解(附案例)

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;Python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注。 目录 一、while嵌套的语法 二、注意事项 三、while嵌套循…

【Java】分支结构习题

【Java】分支结构 文章目录 【Java】分支结构题1 &#xff1a;数字9 出现的次数题2 &#xff1a;计算1/1-1/21/3-1/41/5 …… 1/99 - 1/100 的值。题3 &#xff1a;猜数字题4 &#xff1a;牛客BC110 X图案题5 &#xff1a;输出一个整数的每一位题6 &#xff1a; 模拟三次密码输…

统信UOS安装mysql数据库(mariadb)-统信UOS安装JDK-统信UOS安装nginx(附安装包)

统信UOS离线全套安装教程&#xff08;手把手教程&#xff09; 银河麒麟的各种离线全套安装教程&#xff1a; https://blog.csdn.net/ACCPluzhiqi/article/details/131988147 1.统信UOS桌面系统安装mysql&#xff08;mariadb&#xff09; 2.统信UOS桌面系统安装JDK 3.统信UOS桌…

CAN学习笔记3:STM32 CAN控制器介绍

STM32 CAN控制器 1 概述 STM32 CAN控制器&#xff08;bxCAN&#xff09;&#xff0c;支持CAN 2.0A 和 CAN 2.0B Active版本协议。CAN 2.0A 只能处理标准数据帧且扩展帧的内容会识别错误&#xff0c;而CAN 2.0B Active 可以处理标准数据帧和扩展数据帧。 2 bxCAN 特性 波特率…

【JavaWeb】正则表达式

&#x1f384;欢迎来到边境矢梦的csdn博文&#xff0c;本文主要讲解Java 中正则表达式 的相关知识&#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以关注一下&#x1faf0;&#x1faf0;&am…

Metabase RCE漏洞复现(CVE-2023-38646)

0x01 产品简介 Metabase是一个开源的数据分析和可视化工具&#xff0c;它可以帮助用户轻松地连接到各种数据源&#xff0c;包括数据库、云服务和API&#xff0c;然后使用直观的界面进行数据查询、分析和可视化。 0x02 漏洞概述 未经身份认证的远程攻击者利用该漏洞可以在服务器…

【C语言趣味教程】(4) 变量:代码注释 | 变量的声明 | 初始化与赋值 | 变量的命名 | 关键字 | 标识符 | 变量名的命名规范

&#x1f517; 《C语言趣味教程》&#x1f448; 猛戳订阅&#xff01;&#xff01;&#xff01; Ⅰ. 代码注释&#xff08;Comment&#xff09; 0x00 引入&#xff1a;注释的作用 "程序员最讨厌两种人&#xff1a;一种是不写注释的人&#xff0c;一种是让我写注释的人。…

如何用DHTMLX组件为Web应用创建甘特图?(一)

dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。甘特图仍然是项目管理应用程序中最需要的工具之一&#xff0c;DHTMLX Gantt组件提供了能提升研发甘特图功能所需的重要工具。 在这篇…

【深度学习】InST,Inversion-Based Style Transfer with Diffusion Models,论文

代码&#xff1a;https://github.com/zyxElsa/InST 论文&#xff1a;https://arxiv.org/abs/2211.13203 文章目录 AbstractIntroductionRelated WorkImage style transferText-to-image synthesisInversion of diffusion models MethodOverview ExperimentsComparison with Sty…

我的第一个后端项目(环境搭建,Springboot项目,运行,接口验证)

一. 安装Java开发工具包&#xff08;JDK&#xff09;&#xff1a; 访问Java Software | OracleOracle官方网站&#xff0c;下载适合你操作系统的最新版本的JDK。安装JDK并设置好JAVA_HOME环境变量。 二. 安装集成开发环境&#xff08;IDE&#xff09;&#xff1a; 推荐使用In…

Appium+python自动化(二十八)- 高级滑动(超详解)

高级溜冰的滑动 滑动操作一般是两点之间的滑动&#xff0c;这种滑动在这里称其为低级的溜冰滑动&#xff1b;就是上一节给小伙伴们分享的。然而实际使用过程中用户可能要进行一些多点连续滑动操作。如九宫格滑动操作&#xff0c;连续拖动图片移动等场景。那么这种高级绚丽的溜…