资源加载与优化
- 资源加载与优化
- 常规资源加载方式
- 1. SpawnActor / SpawnActorDeferred / NewObject
- 2. ConstructHelpers
- 3. FStringAssetReference / FSoftObjectPath
- 4. StaticLoadObject
- 5. LoadObject / LoadClass
- 性能与卡顿优化
- 预处理-资源注册表
- 异步载入
在项目的开发过程中,资源作为功能的载体,是产生无限可能的基础。无论是材质、网格、特效,还是玩家、AI、具体的业务逻辑,都需要以资源为支撑。因此,在项目中,资源动态创建非常常见。但是,有的同学却对资源创建的方式有不小疑惑。 同时,在注重性能的项目中,大量的资源动态载入会成为性能瓶颈之一,如何对其进行优化以提升性能,也是对开发的一大挑战。
本文会对常用的资源创建方式做一个整合;同时针对性能方面,提出载入优化的几种方式;另外对UE4中的资源管理进行一个简单的介绍。
知乎的Markdown格式和原文有些许出入,强迫症的同学可访问此链接:
UE4_C++_资源加载与优化_妖刀丶朔夜-CSDN博客blog.csdn.net常规资源加载方式
资源创建一般分为四个步骤: 1. 以文件名创建一个空包
位置: UObjectGlobals.h/ResolveName
- 创建一个FLinkerLoad,并加载对应的Uasset文件,将其序列化
位置:UObjectGlobals.h / LoadPackageInternal -> GetPackageLinker -> LinkerLoad.cpp / CreateLinker
- 加载ImportMap
位置:LinkerLoad.cpp / FinalizeCreation - 加载ExportMap
位置: LinkerLoad.cpp / CreateLoader - > CreateExport
更为详细的步骤可参考https://www.dazhuanlan.com/2019/11/18/5dd230d80a187/
常用的资源载入方式大致分为四种,即:
1. SpawnActor / SpawnActorDeferred / NewObject
当你可以取到资源类型信息时,可使用这种方式。
ACustomAsset* AActor = GetWorld()->SpawnActor<ACustomAsset>(ACustomAsset::StaticClass());
ACustomAsset* BActor = NewObject<ACustomAsset>(this,ACustomAsset::StaticClass());
SpawnActor里也是调用了NewObject来进行资源的创建,但除此之外,还会将生成的Actor添加到World中。当需要创建的类是Actor子类时,推荐使用SpawnActor的形式创建。但当需要创建的对象非Actor子类时,则可以选择第二种方式进行创建
有的Actor在创建的时候,需要额外设置一些参数或者进行一些操作,可通过延迟生成SpawnActorDeferred来达成目的,用法如下:
ACustomAsset* ActorA = GetWorld()->SpawnActorDeferred<ACustomAsset>(ACustomAsset::StaticClass(), FTransform());
if (ActorA)
{
Act