UFL5-5——AB包资源管理器回顾及潜在问题考虑

前置知识点:UH1——AssetBundle

Assetbundle资源加载模块我们主要做什么

目前已有的AB包资源管理器:UH1L4——AB包资源管理器

目前已有的ABManager​中的异步加载部分,只是从AB包中异步加载资源,并没有真正的去异步加载AB包本身,
我们要做的事情,就是对ABManager​进行优化,让其中的异步加载真正意义上的实现异步,就是将AB包本身的加载也变为异步的

异步加载AB包可能带来的问题

如果我们想要将ABManager​中的异步加载方法改为真正意义上的异步
所谓真正意义上的异步是指:不仅从AB包中加载资源是异步的,还需要在加载AB包时也采用异步

那么我们就需要考虑一个问题,如果当我们正在异步加载AB包时,又进行了一次同步加载AB包是否会报错(因为AB包不允许重复加载)

举例说明问题

假设要加载Assets/StreamingAssets/PC​下的test​AB包

image

如果先异步加载再同步加载AB包,则同步加载语句将会报错,因为AB包不可重复加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main : MonoBehaviour
{
void Start()
{
StartCoroutine(TestFun());
AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/PC/test");
}

IEnumerator TestFun()
{
AssetBundleCreateRequest req = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/PC/test");
yield return req;
print(req.assetBundle.name);
}
}

输出:image

如果先异步加载,然后关闭异步加载的协程,再同步加载,依然会报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Main : MonoBehaviour
{
void Start()
{
StartCoroutine(TestFun());
StopCoroutine(c);
AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/PC/test");
}

IEnumerator TestFun()
{
AssetBundleCreateRequest req = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/PC/test");
yield return req;
print(req.assetBundle.name);
}
}

输出:image

因此,只要调用过异步加载的API,之后在加载同名AB包(无论异步同步)都会报错

修改逻辑时的注意事项

通过验证我们得出结论,异步加载AB包时,再同步加载AB包,会因重复加载而报错,因此我们在修改逻辑时应该考虑到这个问题