AssetRegistry 其实主要是在 Editor 下用来方便进行资源的查找和过滤操作,它的主要使用者是 ContentBrowser,这一点在 UE 的文档中也有描述:Asset Registry。
对于项目而言在 Runtime 可能没有需求来使用它,但是在 AssetRegistry
模块一启动就会把 AssetRegistry.bin
加载到内存中,如果对它没有需求其实这部分内存是浪费的。
关闭 AssetRegistry 的影响:无法在运行时通过 AssetRegistry 模块进行资源的依赖分析、以及通过 AssetRegistry 检测资源是否存在的判断。
好在 UE 提供了不序列化或者部分序列化 AssetRegistry 数据的方法,在 UAssetRegistryImpl
的构造函数中会调用 InitializeSerializationOptionsFromIni
函数来读取 DefaultEngine.ini
中的配置,并会构造出一个 FAssetRegistrySerializationOptions
结构来存储,它会在后续的 Serialize
函数中使用,用来控制把哪部分的数据序列化到 AssetRegistry
中。
1 | // Runtime/AssetRegistry/Private/AssetRegistry.cpp |
这个控制方式可以在打包时控制是否生成 AssetRegistry.bin,以及控制在运行时反序列化哪些 AssetRegistry 的数据(但是不会对 DevelopmentAssetRegistry.bin 造成影响,可以用它来进行资产审计)。
它的反序列化流程为:
- 检测
bSerializeAssetRegistry
,如果为true
则把 AssetRegistry.bin 以二进制形式加载到内存中 - 通过
Serialize
函数来把二进制数据反序列化 - 释放加载 AssetRegistry.bin 所占用的内存
所以,AssetRegistry 的内存占用是在序列化之后的数据,而 FAssetRegistrySerializationOptions
就是控制把哪些数据序列化的。
1 | // Runtime/AssetRegistry/Public/AssetRegistryState.h |
配置的读取在以下代码中:
1 | // Runtime/AssetRegistry/Private/AssetRegistry.cpp |
在 Config/DefaultEngine.ini
中创建AssetRegistry
Section 使用上面的名字就可以控制 AssetRegistry 的序列化,减少打包时的包体大小以及内存占用(AssetRegistry 在引擎启动时会加载到内存中)
1 | [AssetRegistry] |
也可以对某个平台来单独指定,只需要修改平台相关的 Ini 文件:
1 | Config/Windows/WindowsEngine.ini |