8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
前言
这是关于资源加载的第一篇内容,主要从StaticLoadObject出发,讨论UE是如何把序列化的数据给加载到内存中的。了解加载过程前必须先了解UPackage、uasset文件格式、FLinkerLoad。了解这三个概念之后会介绍StaticLoadObject加载过程所经过的四个步骤。
UPackage、uasset、FLinkerLoad
一个资源在文件中对应uasset,在内存中对应为UPackage。
1、UPackage
一个资源在内存中表现为一个UPackage的实例,比如一个SoundCue资源,SoundCue内部可能有很多个蓝图节点,就有一些节点的数据,比如Modulator、Mixer等等,这些数据是实例本身的数据。同时SoundCue也引用外部声音文件SoundWave。SoundWave也是一个资源,也是对应的一个UPackage实例。这样两个UPackage之间就存在依赖关系。
UPackage就好比一个班级,底下的数据UObject就好比学生,对于班级(UPackage)底下的同学(UObject)来说,UPackage是UObject的Outer。要知道资源自身数据UObject的内容,必须先知道UPackage才行。
2、uasset文件格式
UPackage序列化到本地之后就是uasset文件。uasset是本地的资源文件,文件格式如图
File Summary 文件头信息
Name Table 包中对象的名字表
Import Table 存放被该包中对象引用的其它包中的对象信息(路径名和类型)
Export Table 该包中的对象信息(路径名和类型)
Export Objects 所有Export Table中对象的实际数据。
前文提过,两个UPackage实例是可以存在依赖关系的,序列化到uasset文件的时候,这些依赖关系就存储为ImportTable。可以把ImportTable看做是这个资源所依赖的其他资源的列表,ExportTable就是这个资源本身的列表。Unity导出资源的时候是导出AssetBundle + 依赖表。每个资源所依赖的其他资源都记录在依赖表中 。这里的uasset可以看做是AssetBundle + 依赖表中这个资源的依赖文件记录。其中AssetBundle就是对应的ExportTable以及ExportObject的内容,依赖表中这个资源的依赖文件记录就是对应的ImportTable。
3、FLinkerLoad
FLinkerLoad是作为uasset和内存UPackage的中间桥梁。在加载内容生成UPackage的时候,UPackage会根据名字找到uasset文件,由FLinkerLoad来负责加载。FLinkerLoad主要内容如下:FArchive* Loader;
//Loader负责读取具体文件
TArrayImportMap;
//将uasset的ImportTable加载到ImportMap中,FObjectImport是需要依赖(导入)的UObject
TArrayExportMap;
//FObjectExport是这个UPackage所拥有的UObject(这些UObject都能提供给其他UPackage作为Import)
在了解了基本概念后,接下来进入主要部分,也就是StaticLoadObject加载,StaticLoadObject可以分成四个部分。
加载内容的四个步骤:根据文件名字创建一个空的包(没有任何文件相关的数据)
建立一个LinkerLoad去加载对应的uasset文件 序列化。
优先加载ImportMap
加载ExportMap(本身的数