欢迎来到天天文库
浏览记录
ID:32946003
大小:59.98 KB
页数:8页
时间:2019-02-18
《成都达内:unity3d开发-内存管理及优化内存》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、成都达内:Unity3D开发■内存管理及优化内存www.cdtedu.com达内教育一中国IT培训领导品牌虽然Unity标榜自己的内存使用全都是"ManagedMemory”,但是事实上你必须正确地使用内存,以保证回收机制正确运行。如果没有做应当做的事情,那么场景和代码很有可能造成很多非必要内存的占用,这也是很多Unity开发者抱怨内存占用太大的原因。接下来我会介绍Unity使用内存的种类,以及相应每个种类的优化和使用的技巧。遵循使用原则,可以让非必要资源尽快得到释放,从而降低内存占用。Unity屮的内存种类实际上Unity游戏使用的内存一共有三种:程序代码、托管ManagedHea
2、p)以及本机堆(NativeHeap)o程序代码包括了所有的Unity引擎,使用的库,以及你所写的所有的游戏代码。在编译后,得到的运行文件将会被加载到设备中执行,并占用一定内存。www.cdtedu.com达内教育一中国IT培训领导品牌这部分内存实际上是没有办法去“管理”的,它们将在内存中从一开始到最后一直存在。一个空的Unity默认场景,什么代码都不放,在iOS设备上占用内存应该在17MB左右,而加上一些自己的代码很容易就飙到20MB左右。想耍减少这部分内存的使用,能做的就是减少使用的库,稍后再说。托管堆是被Mono使用的一部分内存。Mono项目一个开源的.net框架的一种实现,对
3、于Unity开发,其实充当了基本类库的角色。托管堆用来存放类的实例(比如用new生成的列表,实例中的各种声明的变量等)。“托管”的意思是Mono“应该”自动地改变堆的大小来适应你所需要的内存,并且定时地使用垃圾回收(GarbageCollect)来释放已经不需耍的内存。关键在于,有时候你会忘记清除对已经不需要再使用的内存的引用,从而导致Mono认为这块内存一直有用,而无法回收。最后,本机堆是Unity引擎进行申请和操作的地方,比如贴图,音效,关卡数据等。Unity使用了自己的一套内存管理机制來使这块内存具有和托管堆类似的功能。基本理念是,如果在这个关卡里需要某个资源,那么在需要时就加
4、载,之后在没有任何引用时进行卸载。听起来很美好也和托管堆一样,但是由于Unity有一套自动加载和卸载资源的机制,让两者变得差别很大。自动加载资源可以为开发者省不少事儿,但是同时也意味着开发者失去了手动管理所有加载资源的权力,这非常容易导致大量的内存占用(贴图什么的你懂的),www.cdtedu.com达内教育一中国IT培训领导品牌也是Unity给人留下“吃内存”印象的罪魁祸首。优化程序代码的内存占用这部分的优化相对简单,因为能做的事情并不多:主耍就是减少打包时的引用库,改一改build设置即可。对于一个新项目来说不会有太大问题,但是如果是已经存在的项目,可能改变会导致原來所需要的库的
5、缺失(虽说一般來说这种可能性不大),因此有可能无法做到最优。当使用Unity开发时,默认的Mono包含库可以说大部分用不上,在PlayerSettingCEdit■>ProjectSetting->Player或者Shift+Ctrl(Command)+B里的PlayerSetting按钮)面板里,将最下方的0ptimization栏目中“ApiCompatibilityLevel”选为.NET2.0Subset,表示你只会使用到部分的.NET2.0Subset,不需要Unity将全部・NET的Api包含进去。接下来的"StrippingLevel”表示从build的库中
6、剥离的力度,每一个剥离选项都将从打包好的库中去掉一部分内容。你需耍保证你的代码没有用到这部分被剥离的功能,选为“Usemicromscorlib”的话将使用最小的库(一般来说也没啥问题,不行的话可以试试之前的两个)。库剥离可以极人地降低打包后的程序的尺寸以及程序代码的内存占用,唯一的缺点是这个功能只支持Pro版的Unity0这部分优化的力度需要根据代码所用到的.NET的功能来进行调整,有可能不能使用Subset或者最大的剥离力度。www.cdtedu.com达内教育一中国IT培训领导品牌如果超岀了限度,很可能会在需要该功能时因为找不到相应的库而crash掉(iOS的话很可能在Xcod
7、e编译时就报错了)。比较好地解决方案是仍然用最强的剥离,并辅以较小的第三方的类库来完成所需功能。一个最常见问题是最人剥离时Sysytem.Xml是不被Subset和micro支持的,如果只是为了xml,完全可以导入一个轻量级的xml库来解决依赖(Unity官方推荐这个)。关于每个设定对应支持的库的详细列表,可以在这里找到。关于每个剥离级别到底做了什么,Unity的文档也有说明。实际上,在游戏开发屮绝大多数被剥离的功能使用不上的,因此不管如何,库剥离的优化方
此文档下载收益归作者所有