智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...
随笔 - 991, 文章 - 0, 评论 - 27, 阅读 - 341万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

UE4异步载入资源

Posted on   Bill Yuan  阅读(6725)  评论(0编辑  收藏  举报

转自:http://blog.ch-wind.com/ue4%E5%BC%82%E6%AD%A5%E8%BD%BD%E5%85%A5%E8%B5%84%E6%BA%90/

所有的“硬”指针指向的资源都会被UE4在启动时进行载入,为了防止某些情况下引发的巨大延迟,必要的时候我们需要使用异步资源载入系统。

本文参考:https://docs.unrealengine.com/latest/INT/Programming/Assets/AsyncLoading/index.html进行整理。同时也是研究引擎的记录。

对于异步载入有两个类很重要:FStringAssetReferences和TAssetPtr。

FStringAssetReferences是对资源(Asset)的“软”引用,这个结构在BP中使用起来就像是UObject指针一样。而TAssetPtr是对FStringAssetReferences的一个弱引用封装,同时规范所指向的类型,可以在需要的时候调用Get()来解析到具体的资源。

为了避免理解上的偏差,来实际测试一次是最快的。在代码中添加如下属性:

FstringAssetReference在可视化编辑器中显示如下,确实是可以当作UObject指针来使用:

image

TAssetPtr则显示如下:

image

大多数时候,异步载入一个单独的资源基本没什么意义,除非他真的很大。如果要批量异步载入资源的话,就需要用到Object Libraries。这个是Content brower用来进行资源筛选和显示的类,在游戏逻辑中使用也是可以的。

上面的代码对指定的目录创建了一个Library,并且资源进行了载入操作。第二个步骤并不是必须的:

上面的代码在ObjectLibrary中进行筛选并将找到的第一个资源返回。

得到AssetData之后可以将其转换为FStringAssetReference,然后使用StreamableManager进行异步载入。

StreamableManager可以对传递给他的StringReference所引用的资源全部进行载入操作。上面的例子中ItemList的定义为TArray< TAssetPtr<UGameItem> >。也就说针对一个弱引用的列表,获得所有的StringReference之后传递给StreamableManager进行一次性的异步载入。载入之后会调用回调函数以便及时进行处理。在回调函数之前,所有的引用都会被StreamableManager保留,防止其被垃圾回收。

如上,将StreamableManager和Object Libaries进行组合使用,即可实现异步的资源载入了。

(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2013-07-19 友元函数和友元类
点击右上角即可分享
微信分享提示