异步加载

FStreamableManager

FSreamableManager可以帮助我们构建异步处理逻辑,用来将加载逻辑与游戏主逻辑进行,以达到高效加载资源的目的。建议FSreamableManager创建在全局游戏的单例对象中,结合FSoftObjectPath进行加载。 FSreamableManager支持异步加载的同时也支持同步加载。

FSreamableManager创建:

1
2
3
// 构建为栈对象,需要引入头文件,不要构建为堆对象
// #include "Engine/StreamableManager.h"
FStreamableManager m_treamable;

FSoftObjectPath同步加载:

同步加载与之前使用的TryLoad基本一致

头文件:

1
2
3
4
5
UPROPERTY(EditAnywhere)
FSoftObjectPath SourcePath;
// 构建为栈对象,需要引入头文件,不要构建为堆对象
// #include "Engine/StreamableManager.h"
FStreamableManager m_treamable;

注意头文件引入头文件需要在 #include “TestGameInstance.generated.h” 头文件上面既 #include “TestGameInstance.generated.h” 必须是最后一个引入的头文件

cpp文件:

1
2
3
4
5
6
7
8
// FSoftObjectPath 通过蓝图的细节面板拾取
// 借助FStreamableManager配合FSoftObjectPath同步资源
UObject* Source = m_Streamable.LoadSynchronous(SourcePath);
//加载完成后转换资产
UStaticMesh* Mesh = Cast<UStaticMesh>(Source);
if (Mesh) {
UKismetSystemLibrary::PrintString(this, TEXT("加载成功!"));
}

FSoftObjectPath异步加载:

异步加载需要设置回调通知对象与通知函数

在上述同步加载的头文件基础上添加一个回调函数:

1
2
// 异步加载回调函数
void LoadSourceCallback();

然后在初始化函数中,绑定回调函数,我使用的 GameInstance 类 所以这行代码写在 Init 中,一般Actor类,写在BeginPlay 中

1
2
3
4
// FSoftObjectPath 通过蓝图的细节面板拾取
// 借助FStreamableManager配合FSoftObjectPath同步资源
// 这个操作不会阻塞进程
m_Streamable.RequestAsyncLoad(SourcePath, FStreamableDelegate::CreateUObject(this, &UTestGameInstance::LoadSourceCallback));

实现回调函数:

1
2
3
4
5
6
7
8
9
void UTestGameInstance::LoadSourceCallback()
{
// 此函数调用,则表明异步加载完成
// 加载之后完成转换资产
UStaticMesh* Mesh = Cast<UStaticMesh>(SourcePath.ResolveObject());
if (Mesh) {
UKismetSystemLibrary::PrintString(this, TEXT("加载成功!"));
}
}

加载的路径同同步加载一样通过 FSoftObjectPath 在蓝图的细节面板中指定