概要
Addressable 的加载主要由Manager类,Provider类和AsynchOperation负责。
Addressable 开放给开发者的LoadAssetsAsync方法执行后,先是执行了Manager类的方法,在里面先定位了资源的位置信息,随后分发创建具体的Provider类,由Provider类根据资源的类型再创建具体的asyncOperation类创建异步操作,随之完成加载。
具体流程
Addressable 是一个外观类,负责调用各类接口类实现实际操作,其中 AddressableImpl 负责了资源的调度。
资源的加载过程如下
1 2 3 4 5
| public AsyncOperationHandle<TObject> LoadAssetAsync<TObject>(IResourceLocation location) { return TrackHandle(ResourceManager.ProvideResource<TObject>(location)); }
|
资源加载的核心就在这个 ProvideResource方法中。
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 32 33 34 35 36 37 38 39 40 41 42 43 44
| private AsyncOperationHandle ProvideResource(IResourceLocation location, Type desiredType = null) { ... IResourceProvider provider = null; if (desiredType == null) { provider = GetResourceProvider(desiredType, location); ... desiredType = provider.GetDefaultType(location); }
IAsyncOperation op; int hash = location.Hash(desiredType); if (m_AssetOperationCache.TryGetValue(hash, out op)) { op.IncrementReferenceCount(); return new AsyncOperationHandle(op); }
Type provType; if (!m_ProviderOperationTypeCache.TryGetValue(desiredType, out provType)) m_ProviderOperationTypeCache.Add(desiredType, provType = typeof(ProviderOperation<>).MakeGenericType(new Type[] { desiredType }));
op = CreateOperation<IAsyncOperation>(provType, provType.GetHashCode(), hash, m_ReleaseOpCached);
int depHash = location.DependencyHashCode; var depOp = location.HasDependencies ? ProvideResourceGroupCached(location.Dependencies, depHash, null, null) : default(AsyncOperationHandle<IList<AsyncOperationHandle>>); if (provider == null) provider = GetResourceProvider(desiredType, location);
((IGenericProviderOperation)op).Init(this, provider, location, depOp);
var handle = StartOperation(op, depOp); ... return handle; }
|
步骤如下:
- 根据路径信息获取到路径的类型,并得到相应的Provider,Provider 是专门负责某一类资源的加载,负责直接对接 AssetsBundle 或是其他的资源类。
- 生成 AsyncOperation 类,该类用于通知当前资源的加载情况。
- 加载当前路径下依赖的其他的资源
- 将以上的内容整合进一个 ProviderOperation类中,并由它分发给具体的IResource 进行执行,根据情况调用 asyncOperation 的结果callback等。