虚幻官方资产管理笔记
1 为什么资产管理重要
- 所有游戏都需要资产
- 运行的资产是有限的,需要管理、加载、释放
- 影响游戏运行时性能的体验,同步/异步,启动/切换
- 影响包体大小,打包/分块
- 影响更新机制,pak/dlc/chunk
2 什么是资产
3 Package包含哪些对象
- 子对象
- 蓝图
- 类 _C
- DataAsset
- DataTable
4 Object路径
-
格式 类名`/路径/包名.对象名:子对象名
类名一般会被忽视掉,所以一般不写
-
类: /路径/包名.类名_C (包名往往和类名一致)
-
对象: /路径/包名.对象
-
路径: /Root/Path1/Path2
-
路径 根(Root):/Game, /Engine, /XXXModule
5 管理引用
硬引用
直接对象关联,自动触发加载
- UProperty* 直接引用
- TSubClassOf<>(对于某个T类型)
软引用,路径指向
- FSoftObjectPath 例如蓝图中对象的软引用
- FSoftClassPath 例如蓝图中类的软引用
- FSoftObjectPtr 看源码内部包括Package信息
- FSoftObjectPtr<T=UObject>
- FSoftObjectPtr<TClass=Object>
注意: 蓝图中没有使用的函数等也会进行Cook
6 FindObject和LoadObject
-
FindObject如何根据名字获取对象?对象的内存组织关系
FUObjectHashTables.HashOuter, Hash
-
LoadObject如果找不到对象,会尝试加载路径Package
LoadClass==LoadObject <UClass>
7 同步加载 (Sync Load)
- 自动加载
- FSoftObjectPath.TryLoad()->LoadObject
- UKismetSystemLibrary::LoadAsset_Blocking->FSoftObjectPtr::LoadSynchronous->LoadObject
- UKismetSystemLibrary::LoadClassAsset_Blocking
- FStreamableManager::RequestSyncLoad
8 异步加载 (Async LOad)
- UKismetSystemLibrary::LoadAsset->StreamableManager.RequestAsyncLoad(SoftObjectPath)
- UKismetSystemLibrary::LoadAssetClass
- StreamableManager::RequestAsyncLoad
9 Demo 地图进度条加载
- 加载屏幕进度条
- LoadPackageAsync & GetAsyncLoadPackage
B站 直播内容
官方直播 拓展部分