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

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,通过在初始化时缓存变量






 


 

相关文章:

Unity 性能优化二:内存问题

目录 策略导致的内存问题 GFX内存 纹理资源 压缩格式 Mipmap 网格资源 Read/Write 顶点数据 骨骼 静态合批 Shader资源 Reserved Memory RenderTexture 动画资源 音频资源 字体资源 粒子系统资源 Mono堆内存 策略导致的内存问题 1. Assetbundle 打包的时候…...

JavaScript与TypeScript的区别

JavaScript和TypeScript是两种不同的编程语言&#xff0c;在一些方面有一些区别。 1. 类型系统&#xff1a;JavaScript是一种动态类型语言&#xff0c;变量的类型是在运行时确定的&#xff0c;并且可以随时更改。而TypeScript引入了静态类型系统&#xff0c;可以在编译时检查代…...

【NetCore】05-使用Autofac增强容器能力

文章目录 1.什么情况下需要引入第三方容器组件2.如何集成Autoface 1.什么情况下需要引入第三方容器组件 基于名称的注入属性注入子容器基于动态代理的AOP 核心扩展点&#xff1a;IServiceProviderFactory 第三方注入容器均使用这个类作为扩展点&#xff0c;将其注入到框架中…...

sparksql参数

Spark参数场景配置 参数类型 参数 参数说明 平台默认值 场景与建议 资源申请 spark.executor.memory Executor Java进程的堆内存大小 即Executor Java进程的Xmx值 2g 默认设置,或者同时等比例增大,最高不超过默认值的3倍,超过的单独拿出来看下 (注意作业是否数据倾斜&…...

STM32读写内部Flash

参考&#xff1a;https://blog.csdn.net/Caramel_biscuit/article/details/131925715 参考&#xff1a;https://blog.csdn.net/qq_36075612/article/details/124087574?spm1001.2014.3001.5502 目录 内存映射内部Flash的构成对内部Flash的写入过程查看工程内存的分布ROM加载空…...

golang文件锁,目录锁,syscall包的使用

先说结论 1. golang提供了syscall包来实现文件/目录的加锁&#xff0c;解锁 2. syscall包属于文件锁&#xff0c;是比较底层的技术&#xff0c;并不能在所有操作系统上完全实现&#xff0c;linux上实现了&#xff0c;windows下面就没有 3. 加锁时调用syscall.Flock(fd&#…...

数据库数据恢复-Syabse数据库存储页底层数据杂乱的数据恢复案例

数据库恢复环境&#xff1a; Sybase版本&#xff1a;SQL Anywhere 8.0。 数据库故障&#xff1a; 数据库所在的设备意外断电后&#xff0c;数据库无法启动。 错误提示&#xff1a; 使用Sybase Central连接后报错&#xff1a; 数据库故障分析&#xff1a; 经过北亚企安数据恢复…...

移远通信推出新一代高算力智能模组SG885G-WF,为工业和消费级IoT应用带来全新性能标杆

2023年7月24日&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;正式推出其新一代旗舰级安卓智能模组SG885G-WF。该智能模组具有高达48 TOPS 的AI综合算力、强大性能及丰富的多媒体功能&#xff0c;非常适用于需要高处理能力和多媒体功能的工业和消费者…...

微信小程序开发,小程序类目符合,线上版本无权限申请wx.getLocation接口

我开发 的小程序类目符合wx.getLocation接口的申请标准 但是却还是显示无权限申请 后来研究好久才发现&#xff0c;小程序需要在发布线上版本时提交用户隐私保护指引 如未设置也可以在 设置-服务内容声明-用户隐私保护指引-声明处理用户信息项并补充填写后提交用户隐私协议审核…...

vue2企业级项目(五)

vue2企业级项目&#xff08;五&#xff09; 页面适配、主题切换 1、适配 项目下载插件 npm install --save-dev style-resources-loader vue-cli-plugin-style-resources-loader修改vue.config.js部分内容 const path require("path");module.exports {pluginOpt…...

【HTML5】拖放详解及实现案例

文章目录 效果预览代码实现 效果预览 代码实现 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>一颗不甘坠落的流星</title><style>#div1,#div2 {float: left;width: 100px;height: 27px;margin: 10px;paddin…...

Codeforces Round 888 (Div. 3)(视频讲解全部题目)

[TOC](Codeforces Round 888 (Div. 3)&#xff08;视频讲解全部题目&#xff09;) Codeforces Round 888 (Div. 3)&#xff08;A–G&#xff09;全部题目详解 A Escalator Conversations #include<bits/stdc.h> #define endl \n #define INF 0x3f3f3f3f using namesp…...

MySQL之深入InnoDB存储引擎——物理文件

文章目录 一、参数文件二、日志文件三、表结构定义文件四、InnoDB 存储引擎文件1、表空间文件2、重做日志文件 一、参数文件 当 MySQL 实例启动时&#xff0c;数据库会先去读一个配置参数文件&#xff0c;用来寻找数据库的各种文件所在位置以及指定某些初始化参数。在默认情况…...

Jquery操作html常用函数

1. text() 获取元素的文本内容&#xff1a;$("#element").text(); 设置元素的文本内容&#xff1a;$("#element").text("New Text"); 2. html() 获取元素的 HTML 内容&#xff1a;$("#element").html(); 设置元素的 HTML 内容&am…...

【Lua学习笔记】Lua进阶——Table,迭代器

文章目录 官方唯一指定数据结构--tabletable的一万种用法字典和数组 迭代器ipairs()pairs() 回到Table 在【Lua学习笔记】Lua入门中我们讲到了Lua的一些入门知识点&#xff0c;本文将补充Lua的一些进阶知识 官方唯一指定数据结构–table 在上篇文章的最后&#xff0c;我们指出…...

重庆市北斗新型智慧城市政府项目

技术栈&#xff1a;使用vue2JavaScriptElementUIvuexaxiosmapboxcesium 项目描述&#xff1a;重庆市北斗新型智慧城市政府项目是基于千寻孪界开发的一款智慧城市项目&#xff0c;包含车辆实时位置定位&#xff0c;智能设备的报警&#xff0c;基础设施的部设等等功能 工作内容&a…...

FANUC机器人SRVO-217故障报警原因分析及参考解决办法

FANUC机器人SRVO-217故障报警原因分析及参考解决办法 如下图所示,示教器提示:SRVO-217紧急停止电路板未找到, 查阅手册可以看到以下的报警说明: 故障原因: 通电时未能识别紧急停止电路板或者增设的安全I/O装置。连接有多个安全I/O装置的系统中,在报警信息的最后,会显示发…...

统信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桌…...

上门小程序开发|上门服务小程序|上门家政小程序开发

随着移动互联网的普及和发展&#xff0c;上门服务成为了许多人生活中的一部分。上门小程序是一种基于小程序平台的应用程序&#xff0c;它提供了上门服务的在线平台&#xff0c;为用户提供了便捷的上门服务体验。下面将介绍一些适合开发上门小程序的商家。   家政服务商家&am…...

1000道网络安全必备面试题合集,秋招金九银十必看!!!

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&#x…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...