Unity 性能优化二:内存问题

这篇具有很好参考价值的文章主要介绍了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

Unity 性能优化二:内存问题,unity,游戏引擎

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






 


 文章来源地址https://www.toymoban.com/news/detail-615177.html

到了这里,关于Unity 性能优化二:内存问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity3D赛车游戏优化篇】【十】汽车粒子特效和引擎咆哮打造极速漂移

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :Unity游戏demo – 😶‍🌫️版本: Unity2021 😶‍🌫️适合人群:Unity初学者进阶 😶‍🌫️学习目标:3D赛车游戏的基础制作 😶‍🌫️技能

    2024年02月09日
    浏览(42)
  • Unity项目转微信小游戏 微信小程序保姆教程,繁杂问题解决,及微信小游戏平台简单性能测试

    借着某人需求,做了一波简单的技术调研:将Unity项目转换为微信小游戏。 本文主要内容:Unity转换小游戏的步骤,遇到问题的解决方法,以及简单的性能测试对比 微信小游戏的限制 微信小游戏对程序包体大小有严格限制:首包必须小于2M,首包加分包(后加载)不得大于

    2024年02月05日
    浏览(36)
  • Android性能优化之游戏引擎初始化ANR

    近期,着手对bugly上的anr 处理,记录下优化的方向。 借用网上的一张图: 这里的anr 问题是属于主线程的call 耗时操作。需要使用trace 来获取发生anr前一些列的耗时方法调用时间,再次梳理业务,才可能解决。 问题1 java 调用栈: 从调用栈中发现onActivityResult()执行对游戏侧的

    2024年02月15日
    浏览(34)
  • 十八、Unity游戏引擎入门

    1、下载     首先需要下载Unity Hub,下载网址:https://unity.com/cn。     然后在其中下载Unity编辑器并安装,可选择最新版本。     接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件,例

    2024年02月16日
    浏览(48)
  • Android性能优化之修复游戏中内存泄漏(java层)

    游戏在bugly上内存OOM越来越严重,因此,近期对内存进行优化。从java层的内存进行优化开始,通过LeakCannary或者adb shell 获取到内存快照,发现好几处内存泄漏点。 1.单例类持有Activity : 查看内存快照,该闪屏页面Activity(包含引用对象)可回收3.8M的内存; LeakCannary的内存分析也

    2024年02月15日
    浏览(41)
  • Cocos 微信小游戏内存与性能优化指南(iOS端)

    前言 由于微信小游戏普通模式是基于 C++ 渲染层与 JS 编译引擎在原生平台模拟 HTMLCanvas 渲染能力的方案,其中 JS 代码的编译执行效率会极大影响游戏运行的性能。通常 JS 引擎都提供了 JIT 能力用于提高编译速度,这使得小游戏能够在 Android 端取得优异的性能。但是在 IOS 端由

    2024年02月08日
    浏览(28)
  • 使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(49)
  • C# 性能优化和Unity性能优化

    C# 性能优化是一个非常广泛的话题,需要从各个方面来考虑,包括算法和数据结构、编译器优化、代码优化等等。下面是一些常见的 C# 性能优化技巧: 选择正确的数据结构:C# 提供了各种不同的数据结构,例如数组、列表、字典等等。选择正确的数据结构可以大大提高代码

    2024年02月10日
    浏览(31)
  • [Unity]⭐浅谈Unity内存优化,内存碎片?僵尸内存?以及什么是GC垃圾回收机制。

    目录 🟥 一、什么是内存? 1.物理内存   2.虚拟内存 🟧 二、Unity的内存 1.Unity的内存分类 2.游戏运行时内存占用情况 3.什么是MONO内存? 4.内存碎片、僵尸内存 🟨三、GC 垃圾回收 1.定义 2.一张图清晰得看一下流程~ 3.GC的作用及步骤 4.GC存在的问题及优化策略 🟩 四、内存优

    2024年02月03日
    浏览(34)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包