2种引用方式

硬引用(Hard Reference)

即对象 A 引用对象 B,并导致对象 B 在对象 A 加载时加载

  • 硬引用过多会导致运行时很多暂时用不到的资源也被加载到内存中
  • 大量资源会导致进程阻塞,致使程序情动事件过长
  • 用不大的资源也在内存中,会占用内存

软引用(Soft Reference)

即对象 A 通过间接机制(例如字符串形式的对象路径)来引用对象 B

  • 软引用可以减少加载负担,可以缩短程序启动时间
  • 软引用不会主动加载到内存中,在需要时加载,用完释放

蓝图中的资源引用

C++ 中资源的硬引用

直接属性引用

引用资源的最简单方法是创建指针,并通过 UPROPERTY 宏公开。这样允许设计人员通过蓝图继承对原型指定特定资源,或通过放在环境中的实例来指定该资源

UPROPERTY(VisibleAnywhere)
UStaticMeshComponent* body; UPROPERTY(VisibleAnywhere)
class UPhysicsThrusterComponent* upThrusterComp; //class 不需要添加对应头文件,cpp使用时再添加

TSubclassOf 与 UClass

TSubclassOf 与 UClass 类似,但 TSubclassOf 是安全类型,同时具有筛选功能,

UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Class")
UClass* ClassRef; UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Class")
TSubclassOf<AActor> ActorClassRef; // 获取UClass* 指针
ClassRef = ActorClassRef.Get();

构造时引用

  • **ConstructorHelpers::FObjectFinder<T>** 一般用来加载非蓝图资源

  • **ConstructorHelpers::FClassFinder<T>** 一般用来加载蓝图资源并获取蓝图Class

    • 蓝图文件路径_C,如 Blueprint'/Game/CPPFunction/Load/BP_MyActor.BP_MyActor_C'

    • 蓝图文件去掉后缀,如 Blueprint'/Game/CPPFunction/Load/BP_MyActor'

  • FObjectFinder 和 FClassFinder构造函数都是调用LoadObject()

  • 只能在类的构造函数中使用,否则会crash

  • 变量名必须是 static 类型,也可以使用 auto

// 构造函数
// FObjectFinder 方法一
auto paddleMesh = ConstructorHelpers::FObjectFinder<UStaticMesh>(TEXT("StaticMesh'/Game/Demo_Drone/SM/paddle.paddle'"));
if (paddleMesh.Object != nullptr)
{
paddle1->SetStaticMesh(paddleMesh.Object);
} //FObjectFinder 方法二
static ConstructorHelpers::FObjectFinder<UStaticMesh> paddleMesh(TEXT("StaticMesh'/Game/Demo_Drone/SM/paddle.paddle'"));
if (paddleMesh.Succeeded())
{
paddle1->SetStaticMesh(paddleMesh.Object);
} // FClassFinder
static ConstructorHelpers::FClassFinder<AActor> BPClassFinder(TEXT("Blueprint'/Game/CPPFunction/Load/BP_MyActor'"));
if (BPClassFinder.Succeeded()) //或者使用 BPClassFinder.Class != nullptr 判断
{
UClass* MyActorClass = BPClassFinder.Class.Get();
TSubclassOf<AActor>BP_MyActorClass = BPClassFinder.Class;
UE_LOG(LogTemp, Warning, TEXT("class name:%s"),*BP_MyActorClass->GetName());
}

C++ 中资源的软引用

  • 间接引用并不存放资源本身,本章节主要介绍 FSoftObjectPathFSoftClassPathTSoftObjectPtr
  • 使用用这种方式需要手动加载资源(同步/异步加载:LoadObject, StaticLoadObject, FStreamingManager)

FSoftObjectPath

  • FSoftObjectPath 是一个简单的结构体,其中有一个字符串包含资源的完整名称。

  • FSoftObjectPath.SolveObject() 可以检查其引用的资源是否已经载入在内存中,若载入则返还资源对象指针,否则返还空。

  • FSoftObjectPath.Reset() 重置软引用为空

  • AllowedClasses meta标签可以筛选资源类型

    • 筛选自定义类 类型时,只能指定放置在 level 中的物体实例,不推荐
// .h 文件
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "SoftObject", meta = (AllowedClasses = "SkeletalMesh, StaticMesh" ))
FSoftObjectPath SoftObjectPath1; UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "SoftObject", meta = (AllowedClasses = "Texture2D"))
FSoftObjectPath SoftObjectPath2; UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "SoftObject", meta = (AllowedClasses = "Blueprint Class"))
FSoftObjectPath SoftObjectPath3; UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "SoftObject", meta = (AllowedClasses = "Drone")) //自定义类型 不推荐
FSoftObjectPath SoftObjectPath4;
// .cpp文件
void ADrone::BeginPlay()
{
Super::BeginPlay(); if (SoftObjectPath1.IsValid()){ /* 处理*/ }
if (SoftObjectPath2.IsNull()){ /* 处理*/ }
if (SoftObjectPath3.IsAsset()){ /* 处理*/ }
FString SoftObjectPath4_AssetName = SoftObjectPath4.GetAssetName();
FString SoftObjectPath3_AssetPath = SoftObjectPath3.GetAssetPathString();
}

FSoftClassPath

  • FSoftClassPath 继承自 FSoftObjectPath,用于存储一个类型的软引用

  • MetaClass meta标签可以筛选类类型

  • FSoftClassPath 继承自 FSoftObjectPath,因此用法与 FSoftObjectPath 差不多

// .h 文件
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "SoftObjectClass")
FSoftClassPath SoftClassPath; UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "SoftObjectClass", meta = ( MetaClass= "Pawn"))
FSoftClassPath SoftClassPath_Pawn; UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "SoftObjectClass", meta = (MetaClass = "Drone"))
FSoftClassPath SoftClassPath_Drone;

TSoftObjectPtr<T>

  • TSoftObjectPtr 基本上是包含了 FSoftObjectPath 的 TWeakObjectPtr,是智能指针的一种

  • TSoftObjectPtr 与蓝图中的 SoftObjectReference 是一回事

  • 可用于在异步加载完成触发回调函数时,获取资源对应的对象指针

  • TSoftObjectPtr.IsPending() 方法可检查资源是否已准备好可供访问

  • TSoftObjectPtr.Get() 如果被引用资源存在于内存中,将返回这个资源

// .h 文件
// 目前使用4.26,不加 <T> 编译不通过
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "SoftObjectPtr")
TSoftObjectPtr<UObject> SoftObjectPtr1; UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "SoftObjectPtr")
TSoftObjectPtr<UObject> SoftObjectPtr2; UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "SoftObjectPtr")
TSoftObjectPtr<UTexture2D> SoftObjectPtr_Texture2D;
// .cpp 文件 BeginPlay() 函数内
SoftObjectPtr2 = TSoftObjectPtr<AActor>(SoftObjectPath3); //可用 FSoftObjectPath 参数初始化 //此处资源未加载,因而判断为false
if (SoftObjectPtr_Texture2D.IsPending())
{
//获取资源
UTexture2D* MyTexture = SoftObjectPtr_Texture2D.Get();
} //转换成 FSoftObjectPath
FSoftObjectPath AActorSoftPath1 = SoftObjectPtr_Texture2D.ToSoftObjectPath();

TSoftClassPtr<T>

  • 获取类的软引用,转成 UClass*
// .h
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "SoftClassPtr")
TSoftClassPtr<AActor> SoftClassPtr_Actor; UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "SoftClassPtr")
TSoftClassPtr<ADrone> SoftClassPtr_Drone; UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "SoftClassPtr")
TSoftClassPtr<UUserWidget> SoftClassPtr_UserWidget;
// .cpp 

if (SoftClassPtr_Actor.IsPending())
{
UClass* MyActor = SoftClassPtr_Actor.Get();
}

参考

【UE4 C++ 基础知识】<10>资源的引用的更多相关文章

  1. 【UE4 C++ 基础知识】<11>资源的同步加载与异步加载

    同步加载 同步加载会造成进程阻塞. FObjectFinder / FClassFinder 在构造函数加载 ConstructorHelpers::FObjectFinder Constructor ...

  2. 【UE4 C++ 基础知识】<3> 基本数据类型、字符串处理及转换

    基本数据类型 TCHAR TCHAR就是UE4通过对char和wchar_t的封装 char ANSI编码 wchar_t 宽字符的Unicode编码 使用 TEXT() 宏包裹作为字面值 TCHAR ...

  3. 【UE4 C++ 基础知识】<12> 多线程——FRunnable

    概述 UE4里,提供的多线程的方法: 继承 FRunnable 接口创建单个线程 创建 AsyncTask 调用线程池里面空闲的线程 通过 TaskGraph 系统来异步完成一些自定义任务 支持原生的 ...

  4. 深度学习FPGA实现基础知识10(Deep Learning(深度学习)卷积神经网络(Convolutional Neural Network,CNN))

    需求说明:深度学习FPGA实现知识储备 来自:http://blog.csdn.net/stdcoutzyx/article/details/41596663 说明:图文并茂,言简意赅. 自今年七月份 ...

  5. 【UE4 C++ 基础知识】<5> 容器——TArray

    概述 TArray 是UE4中最常用的容器类.其速度快.内存消耗小.安全性高. 其设计时未考虑扩展问题,因此建议在实际操作中勿使用 新建(new) 和 删除(delete) 创建或销毁 TArray ...

  6. 【UE4 C++ 基础知识】<6> 容器——TMap

    概述 TMap主要由两个类型定义(一个键类型和一个值类型),以关联对的形式存储在映射中. 将数据存储为键值对(TPair<KeyType, ValueType>),只将键用于存储和获取 映 ...

  7. 【UE4 C++ 基础知识】<8> Delegate 委托

    概念 定义 UE4中的delegate(委托)常用于解耦不同对象之间的关联:委托的触发者不与监听者有直接关联,两者通过委托对象间接地建立联系. 监听者通过将响应函数绑定到委托上,使得委托触发时立即收到 ...

  8. C# 篇基础知识10——多线程

    1.线程的概念 单核CPU的计算机中,一个时刻只能执行一条指令,操作系统以“时间片轮转”的方式实现多个程序“同时”运行.操作系统以进程(Process)的方式运行应用程序,进程不但包括应用程序的指令流 ...

  9. 【UE4 C++ 基础知识】<2> UFUNCTION宏、函数说明符、元数据说明符

    UFunction声明 UFunction 是虚幻引擎4(UE4)反射系统可识别的C++函数.UObject 或蓝图函数库可将成员函数声明为UFunction,方法是将 UFUNCTION 宏放在头文 ...

随机推荐

  1. git config 选项

    git config  --global -- global 写入选项:写入全局的 ~/.gitconfig 文件而不是版本库的 .git/config,如果 ~/.gitconfig 文件不存在,则 ...

  2. Wpf UserControl使用 KeyBinding,失效问题

    我的问题根源是UserControl未获取相应焦点,在UserControl后台添加如下 public AccountDetailView()         {             Initia ...

  3. 如何在线安全清理mysql慢日志

    部门mysql数据库的服务器磁盘空间快满了,查看了下磁盘的慢日志,发现占了50多个g,百度了资料后删除成功,现在和大家分享下我清理的过程,或许有更好的办法. 1.首先连接进入mysql,查看慢日志的状 ...

  4. 使用 elementUI 树形控件Tree 编辑数据

    操作新增/编辑功能时初始化数据: 应用属性 default-checked-keys 给Tree节点赋默认值(赋值数据为节点数组Arr)前,应先清空数组Arr,并且配合使用 this.$refs.tr ...

  5. 第二十次CSP考试有感

    这是第二次参加csp考试了,大二上学期参加了第17次csp,160分.刚刚下午结束了第20次csp,200分. 这次比赛规则和以往不同,以前可以携带纸质书籍和usb,提交上去的答案不能实时出成绩.现在 ...

  6. Docker系列(13)- 部署es+kibana

    部署elasticsearch # es 暴露的端口很多 # es 十分的消耗内存 # es 的数据一帮需要放置到安全目录!通过挂载实现 # DockerHub上安装文档,其中 --net somen ...

  7. Batch Size对神经网络训练的影响

    ​ 前言 这篇文章非常全面细致地介绍了Batch Size的相关问题.结合一些理论知识,通过大量实验,文章探讨了Batch Size的大小对模型性能的影响.如何影响以及如何缩小影响等有关内容. 本文来 ...

  8. httprunner版本没有更新问题

    使用命令行创建虚拟环境,创建脚手架目录后,使用pycharm打开所创建的脚手架目录. 执行:hrun demo_testcase_request.yml 提示: E:\hrun_ven\test_hr ...

  9. css定位,class属性之间有空格与无空格的区别

    中间有空格的情况 是选择到.class1类下的.class2类子节点,即.class2类的节点要是.class1类子节点 <style> .class1 { color: black; } ...

  10. phpQuery

    以下资料均来自官方文档,官方文档地址:https://code.google.com/archive/p/phpquery/wikis 基础 示例 phpQuery::newDocumentFileX ...