Unity内存优化(-)托管堆ManagedHeap的优化

Unity内存存储揭秘 笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,优快云社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。优快云视频网址:http://edu.csdn.net/lecturer/144 内存优化是一个老生常谈问题了,本篇博客把一些关于内存的知识点给读者介绍一下,先看下图通过Profiler显示的: 阅读详情
AI摘要

本文深入探讨了Unity中托管堆内存的管理方式,包括ManagedHeap.UsedSize和ManagedHeap.reservedUnUsedSize的概念及其对内存占用的影响。通过示例代码演示了Mono堆内存的申请与释放过程,解释了为何内存占用在GC后不会减少的原因。

很多童鞋在进行内存分析的时候都会遇到下面的问题:


ManagedHeap.UsedSize和ManagedHeap.reservedUnUsedSize这两个占用了很大内存,即使手动GC.Collect之后,ManagedHeap.UsedSize和ManagedHeap.reservedUnUsedSize两者的综合仍然没有发生变化,内存占用依然没有缓解。

在分析内存时,也发现了相同的问题。之前的数据表是用Json格式存储的,数据表比较大将近30M,当读取到内存的时候出现了上面的情况。

这是为什么呢?首先,我们要了解几个概念:

  • ManagedHeap 表示的是Mono所使用的托管堆内存,C#上任何的申请托管的内存都会在这个上面申请。
  • ManagedHeap.UsedSize 表示这个托管堆上已经使用的内存大小
  • ManagedHeap.reservedUnUsedSize 表示托管堆上未使用的内存大小

当我们申请内存时,如果ManagedHeap.reservedUnUsedSize的内存不够用,Mono会向os申请内存。并且这个内存会扩大ManagedHeap的大小,并且这个内存不会回落。

我们可以通过Profiler.GetMonoHeapSize()获取Mono堆上的总内存和mono_gc_get_heap_size是一个意思。

下面写了一个测试用例:

using UnityEngine;
using System;
using System.Runtime.InteropServices;
using System.Text;
 
public class TestManagedHeap : MonoBehaviour
{
    public int arraysize = 1024 * 1024 * 200;//条件触发延迟申请的内存1
    public int arraysize_frame = 1024 * 1024 * 10;//条件触发延迟申请的内存2
 
    [DllImport("mono.dll")]
    public static extern long mono_gc_get_used_size();
    [DllImport("mono.dll")]
    public static extern long mono_gc_get_heap_size();
 
    //private StringBuilder builder = new StringBuilder(256);
    // Use this for initialization
    void Start()
    {
    }
 
    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.U))
        {
            byte[] array = new byte[arraysize];
            array = null;
            Debug.Log("申请200M");
            printMemory();
        }
        if (Input.GetKeyDown(KeyCode.A))
        {
            byte[] array = new byte[arraysize_frame];
            Debug.Log("申请10M");
            printMemory();
        }
        if (Input.GetKeyDown(KeyCode.B))
        {
            Debug.Log("调用GC");
            GC.GetTotalMemory(true);
            printMemory();
        }
    }
 
    void printMemory()
    {
        long usedsize = mono_gc_get_used_size();
        long heapsize = mono_gc_get_heap_size();
        long reservedsize = heapsize - usedsize;
        builder.Length = 0;
        //builder.AppendFormat("使用内存:{0},剩余内存{1},托管堆内存{2}",usedsize,reservedsize,heapsize);
        //print(builder.ToString());
    Debug.Log("使用内存=" + usedsize * 1.0f / 1024 / 1024 + "M");
     Debug.Log("剩余内存=" + reservedsize * 1.0f / 1024 / 1024 + "M");
    Debug.Log("托管堆内存=" + heapsize * 1.0f / 1024 / 1024 + "M");
 }

Memory is allocated in heap blocks. More can allocated if it cannot fit the data into the allocated block. Heap blocks will be kept in Mono until the app is closed. In other words, Mono does not release any memory used to the OS (Unity 3.x). Once you allocate a certain amount of memory, it is reserved for mono and not available for the OS. Even when you release it, it will become available internally for Mono only and not for the OS. The heap memory value in the Profiler will only increase, never decrease.

 上面是摘自Unity官方API对Profiling对Mono Memory的解释。

鉴于这个原因,在app开发时需要注意什么呢?

  1. 不要一次性申请过大的内存;
  2. 切换场景等操作时可以自己手动调用GC.Collec

原文地址:http://www.showxyz.com/?p=96

Unity 托管堆内存优化之内存溢出 Out of Memory 导致的崩溃 内存优化之内存溢出 Out of Memory 导致的崩溃为什么会导致内存溢出?Unity内存管理系统堆栈内存和堆内存什么是托管堆?申请内存的原理造成内存溢出的原因解决内存溢出的方案 为什么会导致内存溢出? 导致内存溢出的原因很简单,就是因为我们在大量的使用内存,而由于系统(OS)各种限制原因,我们可以申请使用的内存已达上限,没有多余的内存空间进行申请使用,但是我们仍在无节制的使用内存,最后就导致我们使用的内存已经超过了可使用的内存上限。从而就造成了 Out of Memory 内存溢出,甚至产生崩溃。 这 阅读详情

相关推荐

Unity内存分析与优化实践

在移动端项目中,内存占用是一项非常重要的指标,一般都会被严格控制其大小,否则会导致内存占用过大而影响其他功能的使用。而在移动端Unity中,由于嵌入了Unity引擎,内存占用会一下子飙升,如果控制不好内存的增长,恐怕许多项目都不会允许Unity嵌入到移动端中,在这种时候,内存优化就变得尤为重要,接下来我就在实践中一步一步地对移动端Unity项目进行内存优化,通过工具分析和多角度优化内存,让大家可以清晰地看到内存优化的效果和掌握优化手段。未优化贴图优化后Shader优化后降低屏幕分辨率后。

Nbin_Newby的博客 6320

unity内存优化准则

常见判断准则 内存阈值关注---ManagedHeap.UsedSize建议不超过20M 内存阈值关注---总体Mone建议不超过40M 内存阈值关注---Reserved Memory建议不超过150M 内存阈值关注---2D纹理建议不超过50M 内存阈值关注---Mesh大小建议不超过20M 内存阈值关注---AnimationClip大小建议不超过15M 内存阈值关注---AudioClip...

weixin_41995872的博客 1210

移动端开发中基于Unity的内存使用情况分析

Unity3D为我们提供了一个强大的性能分析工具Profiler。今天我们就使用Profiler来详细分析一下官方例子AngryBots的内存使用信息数据。 首先打开Profiler选择Memory选项,在游戏运行的某一帧查看Detailed选项数据(Simple模式的数据很直观,可以知道内存大体被哪部分占用了),如下图所示:选中后,unity会自动获取这一帧的内存占用数据项,主要分为:Other、Assets、BuiltinResources、Scene Memory、NotSaved这五大部分,下面我们

shengyin714959的博客 757

一些Unity 优化建议 整理(为自己)

1、 由于实时对战游戏的数据包数量巨大,早期版本的帧同步策略会导致比较明显的卡顿,通过进行数据包的合并与优化逐渐解决了卡顿问题; 2、 频繁创建和销毁的小兵对象让CPU爆表了,大量的小兵如果采用实时内存的分配和回收,会产生大量的内存碎片和系统开销,解决方法之一就是采用高效的对象池进行优化,对每个内存对象的状态进行操作即可; 3、 性能分析过程中,发现单人同屏和多人同屏时的开销都很大,通过

蛰伏--当你不够强大时,就不要放弃努力 1万+

ControlCAN.dll开发适配USBCAN_E/2E_U设备

摘要:本文提供了USBCAN_E/2E_U设备的配置指南:1)安装专用驱动;2)获取最新的ControlCAN.dll文件;3)修改VCI调用顺序,新增VCI_SetReference函数设置波特率;4)使用工具计算波特率配置值,并给出了常见波特率对应的代码参考值(如500K对应0x060007)。配置过程强调使用特定工具计算精确的波特率参数,并提供了相关软件下载链接。

weixin_43969033的博客 390

【网络安全】Centos7安装杀毒软件----ClamAV

Clam AntiVirus是一个Linux系统上使用的反病毒软件包。主要应用于邮件服务器,采用多线程后台操作,可以自动升级病毒库。

你在看屏幕的同时,屏幕也在注视着你 8828

Unity内存优化 之 ManagedHeap 整理

//////////////////////////////////////////////////////////////////////////////////// 要了解几个概念: ManagedHeap 表示的是Mono所使用的托管堆内存,C#上任何的申请托管的内存都会在这个上面申请。 ManagedHeap.UsedSize 表示这个托管堆上已经使用的内存大小 ManagedHeap.reservedUnUsedSize 表示托管堆上未使用的内存大小 当我们申请内存时,如果Manag...

蛰伏--当你不够强大时,就不要放弃努力 3343

DEM边界数值爆炸?用ArcGIS空间分析工具链搞定异常值过滤全流程

本文针对DEM数据处理中常见的边界数值爆炸问题,提供了一套完整的ArcGIS空间分析解决方案。文章深入剖析了异常值产生的根源,并详细介绍了从诊断、定位到使用栅格计算器、重分类等工具进行精准过滤与修复的全流程工作流,帮助用户彻底解决由插值误差、数据拼接及坐标系转换引发的数值异常。

weixin_29269441的博客 148

unity使用Profiler工具分析内存占用情况和优化方式

 转载自这里   Unity3D为我们提供了一个强大的性能分析工具Profiler。今天我们就使用Profiler来详细分析一下官方例子AngryBots的内存使用信息数据。     打开方式  window- Analysis-Proflier         首先打开Profiler选择Memory选项,在游戏运行的某一帧查看Detailed选项数据(Simple模式的数据很直观,可以知...

习惯冬天的静谧 2万+

C#教程

C# 教程 C# 是一个简单的、现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的。 本教程将告诉您基础的 C# 编程,同时将向您讲解 C# 编程语言相关的各种先进理念。 现在开始学习 C#! C# 在线工具 谁适合阅读本教程? 本教程有助于初学者理解基础的 C# 编程。在学习完本教程后,您将到达一个中级的 C# 编程水平。

zm1_1zm 1万+

当AI学会自我验证:Chain-of-Verification如何杜绝错误决策?

2025年,大模型"幻觉"问题已成为企业落地AI的最大障碍之一——金融风控中1.2%的误判率可能导致千万级损失,医疗诊断中3%的错误可能危及生命,法律文书中5%的事实偏差可能引发合规风险。MetaAI与Google联合提出的**Chain-of-Verification(CoVe,验证链)**技术,让AI具备"自我审视"能力,通过结构化验证流程将幻觉率降低68%+,在复杂决策场景准确率提升至95%+。本文系统拆解CoVe的技术原理、实施路径与行业实战,为企业提供AI决策可靠性保障的完整方案。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1081

Unity托管堆内存优化实战:5大技巧解决GC卡顿与内存泄漏

在游戏开发中,内存管理是影响性能的关键因素,尤其是托管堆内存的分配与回收。其核心原理在于C#运行时通过垃圾回收器自动管理堆内存,但不当的内存分配会导致频繁的GC暂停,引发游戏卡顿。优化托管堆内存的技术价值在于提升游戏流畅度与稳定性,尤其在移动平台和大型项目中至关重要。常见的应用场景包括高频对象创建、字符串处理和数据集合操作。本文聚焦于Unity开发中的实战技巧,通过对象池化、结构体应用等高效方法,结合字符串优化与缓存策略,系统性地减少GC触发,其中对象池和结构体是解决内存分配问题的核心热词。

weixin_34248023的博客 323

UE5游戏逆向实战:用FModel提取.pak文件中的3D模型(附Dumper-7避坑指南)

本文详细介绍了如何使用FModel工具从UE5游戏的.pak文件中提取3D模型,并提供了Dumper-7的避坑指南。内容涵盖FModel工具链配置、UE5特有的unversioned properties问题解决方案、Dumper-7实战流程以及模型后处理技巧,帮助开发者高效获取游戏资产。

weixin_30872499的博客 422

Unity如何查看当前内存使用情况

【经验】使用Profiler工具分析内存占用情况 版权 Unity3D为我们提供了一个强大的性能分析工具Profiler。今天我们就使用Profiler来详细分析一下官方例子AngryBots的内存使用信息数据。 首先打开Profiler选择Memory选项,在游戏运行的某一帧查看Detailed选项数据(Simple模式的数据很直观,可以知道内存大体被哪部分占用了,网上也有很多相关介绍,我就不再啰嗦了),如下图所示: 选中后,unity会自动获取这一帧的内存占...

weixin_38081382的博客 4476

「Debug R」在从名字空间‘XVector’中出口方法时发现了不是S4通用的函数‘parallelSlotNames’...

每当R语言版本更新,Bioconductor的版本随之更替的时候,总会有一些神奇的报错会出现,比如说下面这种。 Error: package or namespace load failed for ‘GenomicRanges’: 在从名字空间‘XVector’中出口方法时发现了不是S4通用的函数‘parallelSlotNames’ 如果读中文读不懂,我们可以把它翻译成英文。 packa...

xuzhougeng blog 1999

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】5.2 数据分组与透视(CUBE/ROLLUP/GROUPING SETS)

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】5.2 数据分组与透视(CUBE/ROLLUP/GROUPING SETS)

kngines 1835

Unity内存分析器

System.ExecutableAndDlls:系统可执行程序和DLL,是只读的内存,用来执行所有的脚本和DLL引用。不同平台和不同硬件得到的值会不一样,可以通过修改Player Setting的Stripping Level来调节大小。 Ricky:我试着修改了一下Stripping Level似乎没什么改变,感觉虽占用内存大但不会影响游戏运行。我们暂时忽略它吧(- -)! G

qqaazzzqaz的专栏 1650

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Unity ECS内存分配优化:从Archetype原理到高性能实战

在游戏开发与高性能计算领域,内存管理是核心性能瓶颈之一,尤其涉及海量实体实时运算时。其原理在于数据在内存中的布局方式直接决定了CPU缓存的命中率与访问效率。传统面向对象模式下的碎片化内存分配会引发频繁垃圾回收(GC),导致卡顿。数据导向设计通过将相同类型的数据连续排列(结构数组,SoA),极大提升了数据局部性,这是其技术价值所在。这种优化广泛应用于需要处理上万动态单位的大规模策略游戏、模拟仿真等对帧率要求苛刻的应用场景。具体到Unity的实体组件系统(ECS),其Archetype与Chunk内存模型是实现

weixin_30645617的博客 380

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Unity查看当前内存使用情况(针对移动端开发)

Unity3D为我们提供了一个强大的性能分析工具Profiler。今天我们就使用Profiler来详细分析一下官方例子AngryBots的内存使用信息数据。 首先打开Profiler选择Memory选项,在游戏运行的某一帧查看Detailed选项数据(Simple模式的数据很直观,可以知道内存大体被哪部分占用了),如下图所示: 选中后,unity会自动获取这一帧的内存占用数据项,主要分为...

Le_Sam的博客 2973

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【经验】使用Profiler工具分析内存占用情况

Unity3D为我们提供了一个强大的性能分析工具Profiler。今天我们就使用Profiler来详细分析一下官方例子AngryBots的内存使用信息数据。 首先打开Profiler选择Memory选项,在游戏运行的某一帧查看Detailed选项数据(Simple模式的数据很直观,可以知道内存大体被哪部分占用了,网上也有很多相关介绍,我就不再啰嗦了),如下图所示: 选中后,unity会自动获取这一帧的内存占用数据项,主要分为:Other、Assets、BuiltinResources、Scene

Zyt 1873

Unity内存分析利器HeapExplorer:5分钟上手解决内存泄漏

内存管理是软件开发中的核心概念,尤其在游戏开发领域,高效的内存使用直接关系到应用性能与稳定性。其原理在于通过垃圾回收机制自动管理对象生命周期,但不当的引用持有会导致内存泄漏,使对象无法被回收。HeapExplorer的技术价值在于将Unity托管堆中的C#对象可视化,提供根因分析能力,精准定位内存泄漏源。在Unity移动端开发等应用场景中,它帮助开发者快速识别海量字符串、数组等对象的内存占用问题。通过对比分析不同时间点的内存快照,开发者能有效发现托管堆中的异常增长对象,结合Deep Profiling获取完

weixin_30542079的博客 417

Unity 2019.4内存分析实战:从Profiler数据到性能优化

内存管理是游戏开发与软件工程中的核心基础概念,它直接决定了应用程序的稳定性和性能表现。其原理在于操作系统和运行时环境如何为程序分配、使用和回收物理与虚拟内存空间。在Unity引擎中,精准的内存控制具有极高的技术价值,能有效避免崩溃、卡顿和资源浪费,是保障项目成功的关键。对于移动游戏、VR应用等高要求场景,内存优化更是性能调优的重中之重。本文聚焦于Unity 2019.4版本,深入解析其内置Profiler工具,通过分析Assets、Scene、Builtin等关键内存分类,并结合AssetBundle资源管

weixin_34354945的博客 291

项目优化之——内存

内存优化主要从以下几个方面入手: 1.资源内存占用;2.引擎模块自身内存占用;3.托管堆内存占用。 一、资源内存占用 1、资源冗余: 什么时候会出现内存冗余:在通过AssetBundle.Unload(false)卸载AssetBundle对象后,如果重新创建该对象并加载之前加载过的资源到内存时,会出现冗余,即两份相同的资源。 被脚本的静态变量引用的资源,在调用Resou

Patrick 763

unity profiler中教重要的参数

转自:https://www.cnblogs.com/yanghui0702/p/yanghui20181026.html Unity3D为我们提供了一个强大的性能分析工具Profiler。今天我们就使用Profiler来详细分析一下官方例子AngryBots的内存使用信息数据。 首先打开Profiler选择Memory选项,在游戏运行的某一帧查看Detailed选项数据(Simple模式的数据很直观,可以知道内存大体被哪部分占用了),如下图所示: 选中后,unity会自动获取这一帧的内...

折戟 1798

Unity的Profiler的Mono主要讲解

Unity3D为我们提供了一个强大的性能分析工具Profiler。今天我们就使用Profiler来详细分析一下官方例子AngryBots的内存使用信息数据

qq_47119826的博客 1687
上一篇: 详解Unity Profiler内存分析问题
下一篇: Win32 GetKeyState和getasynckeystate
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值