Unity资源管理(一)
Unity中资源类型 常见的资源类型
- 图像文件Texture(纹理)、Sprite(精灵)
- Fbx和模型文件
- 网格和动画Mesh(网格)、Animator(动画控制器)、Animation(动画)
- 音频文件
- 字体Font
- Shader(着色器)
- Meterial(材质)
- Prefab(预制)
资源导入Unity之后,Unity会对导入的源文件进行配置,导入成功的资源和文件夹会创建相应的元文件(.meta)。
根据当前选定的平台和导入设置,资源导入完成会,会在Assets同级的Library中存放处理完毕的资源,并且在Unity运行时会从Library中拿到此版本的资源,上传GPU进行显示。
1.Meta
Meta文件非常重要,看一下Texture的meta文件的数据结构。是一种用YAML格式写入的文本,也用于Prefab和场景。
元文件(meta文件)中包含了有关资源在项目中的使用方式,也就是资源文件的ImportSetting数据;meta文件中包含着GUID,对于Unity的序列化文件(比如Prefab)来说,引用的对象用的就是这个GUID。
guid标志的是当前工程中,当前资源的唯一标识,通过这个一对一的映射关系,可以表示文件与文件之间的关系,比如引用。
fileID是一个资源对象内部所包含其他对象之间的关系。比如Prefab中包含的ponent,每个ponent都有一个fileID使其在对象中独一无二。当Prefab需要实例化时,也会递归遍历其中fileID指向的对象,将其实例化。实例化的对象会获得一个Instance ID,这个ID由guid和fileID转换而成,记录了资源所在的内存地址,可以通过UnityEngine.Object.GetInstanceID获得。
操作系统有物理内存和虚拟内存两个概念。物理内存就是内存条,实实在在的硬件设备,其主要作用是在计算机运行时为操作系统和程序提供临时存储;虚拟内存可以理解为一个内存管理软件,在逻辑上把一块块内存和硬盘空间营造成逻辑相邻的内存区域,以便操作。
CPU访问内存时也并非直接访问,而是先访问CPU Cache中的三级缓存,相对于访问主内存,CPU Cache(高速缓存)的读写速度非常快,只有在Cache中找不到数据,才回去访问主内存
Unity在Editor和Runtime下内存的分配方式完全不同。Editor模式下,只要运行Unity,资源就可能会加载进内存,而Runtime模式下不主动load是不会进内存的,这种策略也是为了保证编辑时的流畅,但也导致打开大的项目会占用很多内存,并且加载耗时特别长。
Unity内存分为Native Memory和Managed Memory,即原生内存和托管内存。Native内存中存储了所有的unity资产(asset),但这些资产会被包装成轻量class放在托管内存中,当用c#创建一个texture时,它的大部分原始数据都在Native内存中,还有一个很小的class类,存放在托管内存中;并且这部分内存会及时返还给系统。Manager Memory是托管堆内存,所有c# ne出的对象都在托管内存中,这些内存的托管就像就是垃圾收集器,简称GC。GC回收的内存不会返还给系统。
多任务系统中,它的内存管理和单任务的DOS有很大差异。DOS 是单任务操作系统,应用程序分配到内存后,如果它不主动释放,系统是不会对它作任何改变的;
多任务系统在同一时刻有多个应用程序共享内存,有时为了使某个重要任务更好地执行,系统可能会对其它任务分配的内存进行移动,甚至删除。所以我们在使用内存时,尽量提高内存的利用率,防止被优化掉。
加载资源会占用内存空间,分配内存空间会使已使用内存块之间出现不连续的甚至无法使用的内存空间,随着游戏的运行,内存持续增长,会增大被系统kill的风险。如何更加合理的加载卸载使用资源就显得更加重要。一套优秀的资源管理方案,能给使用者带来很多遍历,无需过度关注资源释放。
二、资源的加载和卸载资源有三种加载方式
- Resources.Load
- AssetBundle.LoadAsset
- AssetDataBase
第一种方式可以加载Assets文件夹中位于任意位置的名为Resource的文件夹中的所有资源;
第二种方式不能重复加载,内存中只会存在一份;
第三种方式可以在Editor下加载资源。
资源卸载
- object.Destory
- AssetBundle.Unload(true/false)
- Resources.UnloadAsset
- Resources.UnloadUnusedAssets
第一种Destory用来销毁实例对象,实际销毁时机会在渲染之前。AssetBundle.Unload主要用来销毁ab。当使用false作为参数时,只把内存中的ab包销毁,已经引用的资源不会回收;使用true作为参数,会把内存中的ab和已经加载的资源全部销毁,无论是否正在使用。Resources.UnloadAsset只能对存储在磁盘上的资源使用,xxxx。Resources.UnloadUnsedAssets会释放无引用的资源,就是 a=null 之后再调用此方法就可以释放掉,需要注意的是,统计时,弱引用不算引用。
参考
https://blog.ua4d./archives/USparkle_inf_UnityEngine.html
https://mp.eixin.qq./s/0XFQt8LmqoTxxst_kKDMj?
https://.blogs./CodeGize/p/8697227.html
空调维修
- 温岭冰箱全国统一服务热线-全国统一人工【7X2
- 荆州速热热水器维修(荆州热水器维修)
- 昆山热水器故障码5ER-昆山热水器故障码26
- 温岭洗衣机24小时服务电话—(7X24小时)登记报
- 统帅热水器售后维修服务电话—— (7X24小时)登
- 阳江中央空调统一电话热线-阳江空调官方售后电
- 乌鲁木齐阳春燃气灶厂家服务热线
- 珠海许昌集成灶售后服务电话-全国统一人工【
- 乌鲁木齐中央空调维修服务专线-乌鲁木齐中央空
- 新沂热水器故障电话码维修-新沂热水器常见故障
- 诸城壁挂炉24小时服务热线电话
- 靖江空调24小时服务电话-——售后维修中心电话
- 空调室外滴水管维修(空调室外排水管维修)
- 九江壁挂炉400全国服务电话-(7X24小时)登记报修
- 热水器故障码f.22怎么解决-热水器f0故障解决方法
- 营口热水器售后维修服务电话—— 全国统一人工