ue 资源引用和加载

TSoftObjectPtr

IsValid() true 说明在内存中可以直接 调用Get()方法 或者指针

如果IsValid() = false  就需要资源加载,有异步加载和同步加载

以下是案例

		auto Iter = ShouldLoadSkills.CreateConstIterator();
		FStreamableManager& Manager = UAssetManager::GetStreamableManager();
		for (; Iter; ++Iter)
		{
			FString ContextString;
			FName EnumName = UCustomFuncLib_ForWobbo::EnumToFNameCus(TEXT("EWobboSkills"), Iter->Value);
			if(FSkillStruct* TablePtr = SkillTable->FindRow<FSkillStruct>(EnumName, ContextString))
			{
				auto Load = [this, Iter](FSoftObjectPath Path) {
					TSoftObjectPtr PathPtr(Path);
					if (USkillDataBase_ForWobbo* SkillParam = Cast<USkillDataBase_ForWobbo>(PathPtr.Get()))
					{
						if (!SkillRecordMap.Contains(Iter->Key))
						{
							SkillRecordMap.Emplace(Iter->Key, SkillParam);
							BroadCastCD(0, 0, true);
						}
					}
				};
				const FStreamableDelegate& SD = FStreamableDelegate::CreateLambda(Load, TablePtr->SkillPath);
				Manager.RequestAsyncLoad(TablePtr->SkillPath, SD);
			}
		}
		FStreamableManager& Manager = UAssetManager::GetStreamableManager();
		auto Load = [this](FSoftClassPath Path) {
			TSoftClassPtr PathPtr(Path);
			PMClass = PathPtr.Get();
		};
		const FStreamableDelegate& SD = FStreamableDelegate::CreateLambda(Load, PoseMeshPath);
		Manager.RequestAsyncLoad(PoseMeshPath, SD);
	Handler = UAssetManager::Get().LoadAssetList(PreloadPaths, FStreamableDelegate::CreateLambda([=]()
	{
		for (FSoftObjectPath Path : PreloadPaths)
		{
			if(UObject* Load = Path.TryLoad())
			{
				PreLoadAudio.Preload.Add(Load);

				UE_LOG(LogTemp, Log, TEXT("UAudioAsset::Preload. Asset=%s"), *Load->GetName());
			}	
		}
		
	}));

 

------------------------------------------------------------------

FSoftObjectPath,FSoftClassPath,FSoftObjectPtr,TSoftObjectPtr,TSoftClassPtr ,TSubclassOf 

以上都是软引用,不会直接把资源加载到内存中

同步加载和异步加载

同步加载方法:

LoadClass 

// Load a class object.
template< class T > 
inline UClass* LoadClass( UObject* Outer, const TCHAR* Name, const TCHAR* Filename=nullptr, uint32 LoadFlags=LOAD_None, UPackageMap* Sandbox=nullptr )
{
	return StaticLoadClass( T::StaticClass(), Outer, Name, Filename, LoadFlags, Sandbox );
}

LoadObject

// Load an object.
template< class T > 
inline T* LoadObject( UObject* Outer, const TCHAR* Name, const TCHAR* Filename=nullptr, uint32 LoadFlags=LOAD_None, UPackageMap* Sandbox=nullptr )
{
	return (T*)StaticLoadObject( T::StaticClass(), Outer, Name, Filename, LoadFlags, Sandbox );
}

  FStreamableManager的同步加载和异步加载

RequestSyncLoad  同步加载

RequestAsyncLoad 异步加载

---------------------------------------------------------------------------------------------------------------

分类:

hard reference    and  soft   reference

hard reference

1、直接资源引用

比如A类中有此变量

这种写法别人可以在蓝图中直接指定资源。然后在生成A对象的时候直接加载Material资源

2、构造时创建资源

在A类的构造函数中用ConstructorHelpers加载资源。

(ConstructorHelpers先在内存中查找,没有就加载)

UPROPERTY()
class C* x;
MyClass::MyClass(const FObcjectInitializen& ObjectInitializer) : SuCper(ObjectInitializer)
{
    static ConstructorHelpers::FObjectFinder<C> c(TEXT("assetPath"));

    x = c.Object;
}

soft reference

1、间接资源引用,通过存放资源路径或者资源模板(TSoftObjectPtr),来引用资源。而不是直接存放资源指针。IsPending()方法来判断该资源是否准备好可供访问。

需要手动加载才能用,加载方法有(LoadObject, StaticLoadObject, FStreamingManager),同样也分同步加载和异步加载,一次性同步加载过多资源会引起同帧卡顿。

TSoftClassPtr.同理。

UPROPERTY()
TSoftObjectPtr<B> b;
B* func()
{
    if (b.IsPending()) {
        const FSoftObjectPath& AssetRef = b.ToStringReference();
        b = Cast<B>(Streamble.SynchronousLoad(AssetRef));
    }
    return b.Get();
}

2、runtime时候加载

以上三种方法都是基于UPROPERTY()

如果A类对象已经创建完了,这个时候再加载资源就是runtime动态加载。

如果已经在内存中,通过FindObject<>()方法获得资源。

如果资源还没加载: LoadObject<>()

不过LoadObject内部已经有了FindObject。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用[1]:案例测试: //同步加载单个资源LoadSynchronous FSoftObjectPath Path =FString(TEXT("Texture2D'/Game/StarterContent/Textures/T_Brick_Clay_Beveled_D.T_Brick_Clay_Beveled_D'")); UTexture2D* Image = UAssetManager::GetStreamableManager().LoadSynchronous<UTexture2D>(Path,false,nullptr); if (Image) { UE_LOG(LogTemp,Warning,TEXT("Image is %s"),*Image->GetName()); } 。 引用[2]:案例测试: //同步加载资源组 TArray<FSoftObjectPath> Paths; Paths.AddUnique(FString(TEXT("Texture2D'/Game/StarterContent/Textures/T_Brick_Clay_Beveled_N.T_Brick_Clay_Beveled_N'"))); Paths.AddUnique(FString(TEXT("Texture2D'/Game/StarterContent/Textures/T_Brick_Clay_New_D.T_Brick_Clay_New_D'"))); //注意:在资源未完成加载之前代码会在这一行暂停运行以等待资源加载完成。 TSharedPtr<FStreamableHandle> SyncStreamableHandle3 = UAssetManager::GetStreamableManager().RequestSyncLoad(Paths); if (SyncStreamableHandle3) { TArray<UObject*>LoadedAssets; SyncStreamableHandle3->GetLoadedAssets(LoadedAssets); if (LoadedAssets.Num() > 0) { for (int32 i = 0; i < LoadedAssets.Num(); i ) { UTexture2D* Image3 = Cast<UTexture2D>(LoadedAssets[i]); if (Image3) { UE_LOG(LogTemp, Warning, TEXT("Image3 is %s"), *Image3->GetName()); } } } } 。 引用[3]:测试案例介绍: FSoftObjectPath Path2 = FString(TEXT("Texture2D'/Game/StarterContent/Textures/T_Brick_Clay_Beveled_M.T_Brick_Clay_Beveled_M'")); //注意:在资源未完成加载之前代码会在这一行暂停运行以等待资源加载完成。 TSharedPtr<FStreamableHandle> SyncStreamableHandle2 = UAssetManager::GetStreamableManager().RequestSyncLoad(Path2); if (SyncStreamableHandle2) { //使用RequestSyncLoad(方法加载单个资源的时候要用GetLoadedAsset来获得FStreamableHandle中返回的资源。 UTexture2D* Image2 = Cast<UTexture2D>(SyncStreamableHandle2->GetLoadedAsset()); if (Image2) { UE_LOG(LogTemp, Warning, TEXT("Image2 is %s"), *Image2->GetName()); } } 。 问题:UE异步加载image 回答: 在提供的案例中,使用了同步加载的方式来加载UE中的图像资源。通过调用UAssetManager的LoadSynchronous方法,可以同步加载单个资源。例如,在案例[1]中,通过指定资源的路径,可以加载指定的图像资源。如果加载成功,可以通过Image指针来访问图像资源的属性,如名称。类似地,在案例[2]和案例[3]中,也展示了如何同步加载资源组和单个资源。通过使用RequestSyncLoad方法和GetLoadedAsset方法,可以加载并访问相应的图像资源

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值