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
空调维修
- 海信电视维修站 海信电视维修站点
- 格兰仕空调售后电话 格兰仕空调维修售后服务电
- 家电售后服务 家电售后服务流程
- 华扬太阳能维修 华扬太阳能维修收费标准表
- 三菱电机空调维修 三菱电机空调维修费用高吗
- 美的燃气灶维修 美的燃气灶维修收费标准明细
- 科龙空调售后服务 科龙空调售后服务网点
- 华帝热水器维修 华帝热水器维修常见故障
- 康泉热水器维修 康泉热水器维修故障
- 华凌冰箱维修电话 华凌冰箱维修点电话
- 海尔维修站 海尔维修站点地址在哪里
- 北京海信空调维修 北京海信空调售后服务
- 科龙空调维修 科龙空调维修故障
- 皇明太阳能售后 皇明太阳能售后维修点
- 海信冰箱售后服务 海信冰箱售后服务热线电话
- 海尔热水器服务热线