UE SoftReference浅析

概述

资源路径: /Game/ThirdPersonCPP/Maps/UEDPIE_0_NewMap1.NewMap1:PersistentLevel.TestActor1_2

  1. 红色/Game: 资源分区, /Game为GameContent区域, /Engine为EngineContent区域, /Plugin为PluginContent区域

  1. 紫色/ThirdPersonCPP/Maps表示资源路径
  2. 蓝色UEDPIE_0_NewMap1表示Package名称
  3. 黄色NewMap1表示Package内对象名称, 即World.
  4. 黑色:子对象分隔符, 表明其后面的都是子对象.
  5. 绿色PersistentLevel表示以NewMap1作为Outer的SubObject, World中的Level.
  6. 橙色TestActor1_2表示以PersistentLevel为Outer的SubObject, Level内的Actor.

搜寻过程: 通过资源全路径(/Game/ThirdPersonCPP/Maps/UEDPIE_0_NewMap1)找到package(蓝色UEDPIE_0_NewMap1), 通过Package找到World(黄色NewMap1), 通过world找到Level(绿色PersistentLevel), 通过Level找到Actor(橙色TestActor1_2).

查找过程

构造调试环境: 在LevelBlueprint里面添加Resolve Soft Reference节点, 它会将SoftRef转换成ObjRef.

其中蓝图节点ExpandNode内的关键函数为:

调试堆栈:

跟随堆栈, 解析关键函数ResolveObjectInternal, 通过FindObject<UObject>(nullptr, PathString)根据路径查找对应UObject.

SubObj分隔符:

:为SubObject分割符, 其表明后面的Obj为SubObject. 而SubObj不会有FindScriptPackageName查找步骤.

深入函数StaticFindObject, 发现其调用ResolveName, 在ResolveName函数中, 首先将:替换成.., 其意思是将SubObject分隔符:替换成... 然后资源路径由/Game/ThirdPersonCPP/Maps/UEDPIE_1_NewMap1.NewMap1:PersistentLevel.TestActor1_2变成了/Game/ThirdPersonCPP/Maps/UEDPIE_1_NewMap1.NewMap1..PersistentLevel.TestActor1_2.

找到第一个Package

又将.作为分隔符, 提取左边字符串, 后得到:/Game/ThirdPersonCPP/Maps/UEDPIE_1_NewMap1

通过FindObject<UPackage>( InPackage, *PartialName )找到了资源名对应的资源对象. 所以/Game/ThirdPersonCPP/Maps/UEDPIE_1_NewMap1是全路径资源对象.

通过Package找到其内部的Object

资源路径剩余字符串为NewMap1..PersistentLevel.TestActor1_2, 根据分割规则(取.左边字符串)再次分割, 提取字符串为NewMap1

使用函数FindObject<UObject>, 根据OutPartialName, 找到Outer中的对象.

堆栈:

最终, 根据Outer找到其内部的Obj(NewMap1). 所以, NewMap1为Package:/Game/ThirdPersonCPP/Maps/UEDPIE_1_NewMap1下的Obj.

递归查找

根据上述流程易知:

  1. NewMap1为Outer, 根据SubObjectName:PersistentLevel, 找到SubObject对象.
  2. PersistentLevel为Outer, 根据SubObjectName:TestActor1_2, 找到SubObject对象.

总结

冒号的意思

冒号作为SubObject分割符, 表示其后边的名字为SubObj名字, 不会进行FindScriptPackageName查找.

Package路径

资源名称, 中Package路径/Game/ThirdPersonCPP/Maps/UEDPIE_0_NewMap1

首个Obj对象

第一个.后边的名称作为第一个对象NewMap1

子对象

:后的内容全部作为子对象, 用.分隔, 递归查找. :PersistentLevel.TestActor1_2

参考