Unity 性能优化二:内存问题

目录

策略导致的内存问题

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.mzph.cn/news/13251.shtml

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

相关文章

项目——负载均衡在线OJ

目录 项目介绍开发环境所用技术项目宏观结构编写思路1. 编写compile_server1.1 编译模块编写1.2 运行功能1.3compile_runner 编译与运行1.4 编写compile_server.cpp调用compile_run模块&#xff0c;形成网络服务 2. 编写基于MVC的oj_server2.1 oj_server.cpp的编写2.2 oj_model…

后端性能测试的类型

目录 性能测试的类型 负载测试(load testing) 压力测试(Stress Testing) 可扩展性测试( 尖峰测试(Spike Testing) 耐久性测试(Endurance Testing) 并发测试(Concurrency Testing) 容量测试(Capacity Testing) 资料获取方法 性能测试的类型 性能测试&#xff1a;确定软…

pytorch模型的保存与加载

1 pytorch保存和加载模型的三种方法 PyTorch提供了三种方式来保存和加载模型&#xff0c;在这三种方式中&#xff0c;加载模型的代码和保存模型的代码必须相匹配&#xff0c;才能保证模型的加载成功。通常情况下&#xff0c;使用第一种方式&#xff08;保存和加载模型状态字典…

【Linux下6818开发板(ARM)】硬件空间挂载

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

linux----源码安装如何加入到系统服务中(systemclt)

将自己源码安装的软件加入到系统服务中。例如nginx,mysql 就以nginx为例&#xff0c;源码安装&#xff0c;加入到系统服务中 使用yum安装nginx&#xff0c;自动会加入到系统服务 16-Linux系统服务 - 刘清政 - 博客园 (cnblogs.com) 第一步: 源码安装好nginx之后&#xff0…

【Maven】Maven配置国内镜像

文章目录 1. 配置maven的settings.xml文件1.1. 先把镜像mirror配置好1.2. 再把仓库配置好 2. 在idea中引用3. 参考资料 网上配置maven国内镜像的文章很多&#xff0c;为什么选择我&#xff0c;原因是&#xff1a;一次配置得永生、仓库覆盖广、仓库覆盖全面、作者自用的配置。 1…

JavaSE - Sting类

目录 一. 字符串的定义 二. String类中的常用方法 1. 比较两个字符串是否相等&#xff08;返回值是boolean类型&#xff09; 2. 比较两个字符串的大小&#xff08;返回值是int类型&#xff09; 3. 字符串查找 &#xff08;1&#xff09;s1.charAt(index) index:下标&…

Vue3中使用pinia

在Vue 3中使用Pinia&#xff0c;您需要按照以下步骤进行设置&#xff1a; 安装Pinia&#xff1a; npm install pinia创建和配置Pinia存储&#xff1a; // main.jsimport { createApp } from vue import { createPinia } from pinia import App from ./App.vueconst app create…

基于RK3588+AI的边缘计算算法方案:智慧园区、智慧社区、智慧物流

RK3588 AI 边缘计算主板规格书简介 关于本文档 本文档详细介绍了基于Rockchip RK3588芯片的AI边缘计算主板外形、尺寸、技术规格&#xff0c;以及详细的硬件接口设计参考说明&#xff0c;使客户可以快速将RK3588边缘计算主板应用于工业互联网、智慧城市、智慧安防、智慧交通&am…

Python 进阶(四):日期和时间(time、datetime、calendar 模块)

❤️ 博客主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;Python 入门核心技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; 文章目录 1. time模块1.1 获取当前时间1.2 时间休眠1.3 格式化时间 2. datetime模块2.1 获取当前…

EXCEL数据自动web网页查询----高效工作,做个监工

目的 自动将excel将数据填充到web网页&#xff0c;将反馈的数据粘贴到excel表 准备 24KB的鼠标连点器软件&#xff08;文末附链接&#xff09;、Excel 宏模块 优势 不需要编程、web验证、爬虫等风险提示。轻量、稳定、安全。 缺点 效率没那么快 演示 宏环境 ht…

Go语法入门 + 项目实战

&#x1f442; Take me Hand Acoustic - Ccile Corbel - 单曲 - 网易云音乐 第3个小项目有问题&#xff0c;不能在Windows下跑&#xff0c;懒得去搜Linux上怎么跑了&#xff0c;已经落下进度了.... 目录 &#x1f633;前言 &#x1f349;Go两小时 &#x1f511;小项目实战 …

《Kubernetes故障篇:unable to retrieve OCI runtime error》

一、背景信息 1、环境信息如下&#xff1a; 操作系统K8S版本containerd版本Centos7.6v1.24.12v1.6.12 2、报错信息如下&#xff1a; Warning FailedCreatePodSandBox 106s (x39 over 10m) kubelet (combined from similar events): Failed to create pod sandbox: rpc error: …

【SAP Abap】记录一次SAP长文本内容通过Web页面完整显示的应用

【SAP Abap】记录一次SAP长文本内容通过Web页面完整显示的应用 1、业务背景2、实现效果3、开发代码3.1、拼接html3.2、显示html3.3、ALV导出Excel 1、业务背景 业务在销售订单中&#xff0c;通过长文本描述&#xff0c;记录了一些生产备注信息&#xff0c;如生产标准、客户要求…

Jacobi雅克比算法计算特征向量-全网最简单

算法原理 算法涉及数据&#xff1a; 矩阵V&#xff1a;存储特征向量。 矩阵A&#xff1a;表示需要求特征向量的实对称矩阵。算法过程&#xff1a;&#xff08;1&#xff09;初始化V为对角矩阵&#xff0c;即主对角线的元素是1&#xff0c;其他元素都为0。&#xff08;2&#x…

CentOS7安装jenkins

一、安装相关依赖 sudo yum install -y wget sudo yum install -y fontconfig java-11-openjdk二、安装Jenkins 可以查看官网的安装方式 安装官网步骤 先导入jenkins yum 源 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo…

MySQL~DCL

三、DCL 1、SQL分类 DDL&#xff1a;操作数据库和表 DML&#xff1a;增删改表中数据 DQL&#xff1a;查询表中数据 DCL&#xff1a;管理用户&#xff0c;授权 DBA&#xff1a;数据库管理员 DCL&#xff1a;管理用户&#xff0c;授权 2、管理用户 2.1 添加用户 语法&a…

索引的数据结构

索引的数据结构 部分资料来自B站尚硅谷-宋红康老师 1. 为什么使用索引 使用索引是为了加快数据库的查询速度和提高数据库的性能。索引是数据库表中的一种数据结构&#xff0c;它可以帮助数据库快速定位并检索所需的数据。 当数据库表中的数据量较大时&#xff0c;如果没有索…

ELK + Fliebeat + Kafka日志系统

参考&#xff1a; ELKFilebeatKafka分布式日志管理平台搭建_51CTO博客_elk 搭建 ELK 日志分析系统概述及部署&#xff08;上&#xff09;-阿里云开发者社区 ELK是三个开源软件的缩写&#xff0c;分别表示&#xff1a;Elasticsearch , Logstash, Kibana , 它们都是开源软件。…

Python桥接模式介绍、使用

一、Python桥接模式介绍 概念&#xff1a; Python桥接模式&#xff08;Bridge Pattern&#xff09;是一种软件设计模式&#xff0c;用于将抽象部分与其实现部分分离&#xff0c;使它们可以独立地变化。 它可以通过使用桥接接口来创建一个桥接对象来连接抽象和实现部分。 功能…