unity占内存大小_Unity3D占用内存太大怎么解决呢

Unity3D占用内存太大怎么解决呢

尽管都叫Asset,但仿制的和引证的是不一样的,这点被Unity的暗黑技术细节掩盖了,需求自己去了解。

关于内存办理

依照传统的编程思想,最好的办法是:自己保护一切目标,用一个Queue来保存一切object,不必时该Destory的,该Unload的自己处理。

但这样在C# .net结构底下有点没必要,而且很费事。

保险起见你能够这样办理

创立时:

先树立一个AssetBundle,无论是从www仍是文件仍是memory

用AssetBundle.load加载需求的asset

加载完后当即AssetBundle.Unload(false),开释AssetBundle文件自身的内存镜像,但不毁掉加载的Asset目标。(这样你不必保存AssetBundle的引证而且能够当即开释一部分内存)

开释时:

如果有Instantiate的目标,用Destroy进行毁掉

在合适的当地调用Resources.UnloadUnusedAssets,开释现已没有引证的Asset.

如果需求当即开释内存加上GC.Collect(),否则内存未必会当即被开释,有时分可能导致内存占用过多而引发反常。

这样能够确保内存一直被及时开释,占用量最少。也不需求对每个加载的目标进行引证。

当然这并不是仅有的办法,只需遵从加载和开释的原理,任何做法都是能够的。

体系在加载新场景时,一切的内存目标都会被主动毁掉,包含你用AssetBundle.Load加载的目标和Instaniate克隆的。可是不包含AssetBundle文件自身的内存镜像,那个有必要要用Unload来开释,用.net的术语,这种数据缓存对错保管的。

总结一下各种加载和初始化的用法:

AssetBundle.CreateFrom.....:创立一个AssetBundle内存镜像,留意同一个assetBundle文件在没有Unload之前不能再次被运用

WWW.AssetBundle:同上,当然要先new一个再 yield return 然后才干运用

AssetBundle.Load(name): 从AssetBundle读取一个指定称号的Asset并生成Asset内存目标,如果屡次Load同名目标,除第一次外都只会回来现已生成的Asset 目标,也就是说屡次Load一个Asset并不会生成多个副本(singleton)。

Resources.Load(path&name):同上,仅仅从默许的方位加载。

Instantiate(object):Clone 一个object的完好结构,包含其一切Component和子物体(详见官方文档),浅Copy,并不仿制一切引证类型。有个特别用法,尽管很少这样 用,其实能够用Instantiate来完好的复制一个引证类型的Asset,比方Texture等,要复制的Texture有必要类型设置为 Read/Write able。

总结一下各种开释

Destroy: 首要用于毁掉克隆目标,也能够用于场景内的静态物体,不会主动开释该目标的一切引证。尽管也能够用于Asset,可是概念不一样要当心,如果用于毁掉从文 件加载的Asset目标会毁掉相应的资源文件!可是如果毁掉的Asset是Copy的或者用脚本动态生成的,只会毁掉内存目标。

AssetBundle.Unload(false):开释AssetBundle文件内存镜像

AssetBundle.Unload(true):开释AssetBundle文件内存镜像一起毁掉一切现已Load的Assets内存目标

Reources.UnloadAsset(Object):显式的开释已加载的Asset目标,只能卸载磁盘文件加载的Asset目标

Resources.UnloadUnusedAssets:用于开释一切没有引证的Asset目标

GC.Collect()强制废物收集器当即开释内存 Unity的GC功用不算好,没把握的时分就强制调用一下

想知道更多关于IT行业的信息吗?想远远不如行动,行动起来,一起加入达内,一起进入IT行业,跟着达内的脚步,一起走进如今的互联网信息时代,带给你不一样的色彩生活——【深圳Unity3D培训】

你可能感兴趣的:(unity占内存大小)