首页 > 系统相关 >Unity内存浅谈一

Unity内存浅谈一

时间:2023-04-26 18:35:32浏览次数:45  
标签:文件 释放 浅谈 托管 Unity 垃圾 内存

Unity主要使用的还是c#,就先从这里写写吧

.Net 内存管理机制主要还是分为托管堆内存和非托管内存。

 

.Net托管堆内存管理主要的核心思想就是,你只管制造垃圾,它自己会帮你回收垃圾,因为自己是无法回收自己制造的垃圾的,必须依靠它的垃圾回收机制。

托管堆主要的内存产生方式就是new一个新对象,一个mmo手游同屏人数比较多时托管堆内存的的大小也应该在50-80MB以内

当使用new关键字来一个空类对象时,就会产生堆内存

在unity中,贴图,模型,网格,材质Shader等等一些文件内存,其实都不是.Net分配出来的内存,保存在堆内存的变量只是记录了一个文件内存的指针,实际则保存在非托管堆中。

那托管堆和非托管堆内存应该如何进行释放呢?

上文已经说过了,托管堆内存我们自己是无法释放的,必须等到系统垃圾回收的时候,非托管堆内存就不一样了,Unity提供了API来控制。

Resources.UnloadAsset(obj);

Resources.UnloadUnusedAssets();

第一个需要传入一个资源文件,也就是要指定释放内存,比如mesh,shader,texture

第二个是卸载无用资源,这个函数执行是比较慢的。

除了unity的资源,还有文件执行诶都属于非托管堆内存,例如:

@@@@@@

会IO错误,虽然文件流的指针指向了null,但是所占的非托管堆内存并没有被释放掉,所以再次请求就报错了,其实只需要进行一下GC,就不会报错了。

@@@@@@

fileStream指向null之后,堆内存中还没有进行释放,GC以后就会执行析构函数,等析构函数执行完毕,fileStream就会在析构函数中将文件句柄Dispose掉,后面就可以直接使用。

C#有提供一个IDisposable接口,就是专门用来主动释放非托管堆内存的,或者使用 using()就会自动调用类的Dispose方法来释放。

 

标签:文件,释放,浅谈,托管,Unity,垃圾,内存
From: https://www.cnblogs.com/zzhangshiye/p/14248345.html

相关文章

  • linux下分析java程序占用CPU、内存过高
    转:https://www.cnblogs.com/wu-wu/p/11923250.html CPU过高分析1)使用TOP命令查看CPU、内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比。其中CPU状态中标示id的为空闲CPU百分比。当空闲CPU百分比越低,说明CPU占用率......
  • 第十二章:变量、作用域及内存
    学习要点:1.变量及作用域2.内存问题JavaScript的变量与其他语言的变量有很大区别。JavaScript变量是松散型的(不强制类型)本质,决定了它只是在特定时间用于保存特定值的一个名字而已。由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命......
  • 数据库占用大量内存的检测和优化(PostgreSQL)
    select*frompg_stat_user_tableswheren_live_tup>100000andseq_scan>0orderbyseq_tup_readdesclimit10;这个SQL查询用于检查在PostgreSQL数据库中,哪些用户表(usertables)的行数(livetuples)超过100,000,且进行了顺序扫描(sequentialscans)。查询结果会按顺序......
  • 【Unity】高级——有限状态机(角色控制)移动、待机
    简介有限状态机是unity游戏开发中经常用到的一个概念,能制作敌人AI,玩家控制器等。有限状态机允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类实现:将一个个具体的状态类抽象出来经典案例:玩家行动器案例中玩家行动包括:待机、移动、跳跃、冲刺、爬墙等而这......
  • Unity性能优化课程学习笔记(Metaverse大衍神君)
    课程来源于:https://space.bilibili.com/1311706157 性能优化之道:      等待函数:  SSAO:  AA方案:  后处理: 渲染提前期优化culling,simplization,batchingCulling     Simplization:      Ba......
  • 08 内存(下)实现内存页的分配和释放
    初始化完内存页和内存区,接下来就实现分配和释放内存页面;内存页的分配: 内存分配页面接口函数:mm_division_pages,进而调用mm_divpages_fmwk内存分配页面框架函数,此函数先返回对应的内存区结构的指针,然后调用内存分配核心函数mm_divpages_core,返回msadsc_t结构体指针,包含返回......
  • Unity】一步跳过Unity启动屏/Logo, 全平台适用,Unity官方API支持
    Unity启动Logo让人非常不爽,因为展示unitylogo非常拖沓,延缓了打开游戏的时间,用0元购版本又怕收到律师函。终于....刷github学习的时候意外发现一段有趣的代码,说是能跳过UnityLogo启动屏:https://github.com/psygames/UnitySkipSplash/blob/main/SkipSplash.cs翻了一下UnityA......
  • 浅谈拉格朗日插值法
    浅谈拉格朗日插值法好像FFT要用到,所以就学习一手版题什么是插值在离散数据的基础上补插连续的函数,使得这条连续函数经过所有离散数据点,这个过程就叫插值。其意义在于:插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。理......
  • 浅谈1688商品详情的应用场景
    场景分析1688商品详情接口是一种用于访问阿里巴巴旗下的批发市场平台(1688.com)上的商品信息的API接口。通过该接口,可以获取商品的详细信息,包括商品名称、规格、价格、描述、图片等。这些信息对于买家和卖家来说都非常重要,可以帮助他们更好地了解商品,做出更明智的购买决策。以下是168......
  • Unity3D:目标约束
    推荐:将NSDT场景编辑器加入你的3D工具链3D工具集:NSDT简石数字孪生目标约束(AimConstraints)AimConstraint可旋转游戏对象以朝向其源游戏对象。还可针对另一个轴保持一致方向。例如,可将AimConstraint添加到摄像机。要在约束瞄准摄像机时保持摄像机直立,请指定摄像机的向上轴和......