Unity3D内存管理

    作者:匿名更新于: 2021-10-18 15:21:18

      当执行机器学习任务时,您需要学习如何使用代码来快速检查模型的内存占用,理由很简单,硬件资源有限,一个机器学习模块不应该占用系统的全部内存,这在边缘计算场景中尤为重要。

      在内存占用方面一直备受指责,尤其是在面向移动设备的游戏开发中,内存占用就会飙升到一两百兆,导致内存资源耗尽,从而被系统强退造成极差的体验,这样的情况并不罕见,但却可以完全避免。尽管Unity的内存管理系统理论上应该是让开发人员心烦意乱,让每个人都参与其中,但在如何管理Unity内存方面,官方文档中并没有太多的说明,基本是靠自己摸索。近期接手的项目有严重的内存问题,在参考文档和许多猜测和验证之后,总结了在内存分配和管理的基本方法,这里就简单地总结了一下。

      尽管宣称自己的内存使用完全,但实际上您必须正确使用内存才能确保回收机制正常运行。不做该做的话,场景和代码很可能会导致大量非必需的内存占用,这也是许多开发人员抱怨占用过多内存的原因。下面我们将介绍对内存的使用,以及对每种内存类型的优化和使用的提示,按照使用原则,可以使非必要资源尽快释放,从而减少内存的占用。  

     

      存储器类型在Unity中,实际上,游戏中使用的内存有程序代码、管理堆和原始堆,程序代码包括所有发动机、使用的库和你写的所有游戏代码三种。经过编译后,得到的运行文件被加载到设备中执行,并占用一定的内存。

      这些内存实际上是没有办法来“管理”的,它们会在存储器中从头到尾一直存在。Unity的默认场景是空的,不放任何代码,在iOS设备上应该占用大约17MB的内存,而且一些自己的代码也很容易飙升到20MB左右。为了减少内存的使用,您可以做的就是减少使用的库,以后再说。

      管理堆是Mono使用的一部分内存。Mono项目是一种开源的.net框架的实现,实际上是Unity开发的一个基本类库。  

     

      被管理的堆用于存放类的实例(例如,用new生成的列表、实例中声明的各种变量等等)。意思是Mono“应该”自动改变堆的大小,以适应您所需要的内存,而且垃圾收集的时间会被用来释放不再需要的内存。重点是,有时您忘了清除对已不再需要的内存的引用,因此,Mono认为该内存一直有用,而不能被回收。

      最终,本地堆是Unity引擎用于申请和操作诸如地图、声音效果、关卡数据等。Unity使用一套自己的内存管理机制,使这个内存与托管堆相似。

      其基本思想是,如果在此关卡中需要某个资源,则在需要时加载,然后在没有任何引用时卸载,这听上去很不错,就像托管堆,但因为有一套自动装入和卸载资源的机制,所以这两种资源之间的差异非常大,自动化载入资源可以为开发者节省很多事情。

      但因为Unity有一套自动装入和卸载资源的机制,所以这两种资源之间的差异非常大,自动化载入资源可以为开发者节省很多事情,虚拟存储器允许任务执行的过程不需要完全在存储器中,通常我们使用点击软件占用大量存储器,这些软件占用的存储器远远超过计算机本身所有的物理存储器。

      正因为有了虚拟内存,程序就可以通过虚拟存储器获得一个超过系统物理内存大小的可用内存空间,将内存扩展到硬盘空间。

        >>>>>>点击进入游戏开发专题

课课家教育

未登录