UE4异步载入资源

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

全部的“硬”指针指向的资源都会被UE4在启动时进行载入,为了防止某些状况下引起的巨大延迟,必要的时候咱们须要使用异步资源载入系统。app

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

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

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

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

FstringAssetReference在可视化编辑器中显示以下,确实是能够看成UObject指针来使用:this

image

TAssetPtr则显示以下:spa

image

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

上面的代码对指定的目录建立了一个Library,而且资源进行了载入操做。第二个步骤并非必须的:code

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

获得AssetData以后能够将其转换为FStringAssetReference,而后使用StreamableManager进行异步载入。

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

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

相关文章
相关标签/搜索