Skip to content

Commit 4874318

Browse files
committed
使用协程锁简化部分逻辑
1 parent 204cecd commit 4874318

5 files changed

Lines changed: 51 additions & 123 deletions

File tree

Assets/BundleMaster/BundleMasterRuntime/AssetComponent.cs

Lines changed: 14 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -190,60 +190,39 @@ public static async ETTask<T> LoadAsync<T>(string assetPath, string bundlePackag
190190
{
191191
bundlePackageName = AssetComponentConfig.DefaultBundlePackageName;
192192
}
193-
194-
T asset = null;
195193
if (AssetComponentConfig.AssetLoadMode == AssetLoadMode.Develop)
196194
{
197195
#if UNITY_EDITOR
198-
asset = AssetDatabase.LoadAssetAtPath<T>(assetPath);
196+
return AssetDatabase.LoadAssetAtPath<T>(assetPath);
199197
#else
200198
AssetLogHelper.LogError("加载资源: " + assetPath + " 失败(资源加载Develop模式只能在编辑器下运行)");
199+
return null;
201200
#endif
202-
return asset;
203201
}
204-
LoadHandler loadHandler = null;
205202
if (!BundleNameToRuntimeInfo.TryGetValue(bundlePackageName, out BundleRuntimeInfo bundleRuntimeInfo))
206203
{
207204
AssetLogHelper.LogError(bundlePackageName + "分包没有初始化");
208205
return null;
209206
}
210-
if (!bundleRuntimeInfo.AllAssetLoadHandler.TryGetValue(assetPath, out loadHandler))
207+
if (!bundleRuntimeInfo.AllAssetLoadHandler.TryGetValue(assetPath, out LoadHandler loadHandler))
211208
{
212209
loadHandler = LoadHandlerFactory.GetLoadHandler(assetPath, bundlePackageName, true, true);
213210
bundleRuntimeInfo.AllAssetLoadHandler.Add(assetPath, loadHandler);
214211
bundleRuntimeInfo.UnLoadHandler.Add(loadHandler.UniqueId, loadHandler);
215212
}
213+
//加载资源
214+
CoroutineLock coroutineLock = await CoroutineLockComponent.Wait(CoroutineLockType.BundleMaster, LoadPathConvertHelper.LoadPathConvert("T|" + assetPath));
216215
if (loadHandler.LoadState == LoadState.NoLoad)
217216
{
218-
ETTask tcs = ETTask.Create(true);
219-
loadHandler.AwaitEtTasks.Add(tcs);
220217
await loadHandler.LoadAsync();
221218
AssetBundleRequest loadAssetAsync = loadHandler.FileAssetBundle.LoadAssetAsync<T>(assetPath);
222219
loadAssetAsync.completed += operation =>
223220
{
224221
loadHandler.Asset = loadAssetAsync.asset;
225-
asset = loadHandler.Asset as T;
226-
for (int i = 0; i < loadHandler.AwaitEtTasks.Count; i++)
227-
{
228-
ETTask etTask = loadHandler.AwaitEtTasks[i];
229-
etTask.SetResult();
230-
}
231-
loadHandler.AwaitEtTasks.Clear();
232222
};
233-
await tcs;
234-
return asset;
235-
}
236-
else if (loadHandler.LoadState == LoadState.Loading)
237-
{
238-
ETTask tcs = ETTask.Create(true);
239-
loadHandler.AwaitEtTasks.Add(tcs);
240-
await tcs;
241-
return (T)loadHandler.Asset;
242-
}
243-
else
244-
{
245-
return (T)loadHandler.Asset;
246223
}
224+
coroutineLock.Dispose();
225+
return (T)loadHandler.Asset;
247226
}
248227

249228
/// <summary>
@@ -295,55 +274,36 @@ public static ETTask<T> LoadAsync<T>(out LoadHandler handler, string assetPath,
295274
if (AssetComponentConfig.AssetLoadMode == AssetLoadMode.Develop)
296275
{
297276
#if UNITY_EDITOR
298-
UnityEngine.Object asset = AssetDatabase.LoadAssetAtPath(assetPath, typeof(UnityEngine.Object));
277+
return AssetDatabase.LoadAssetAtPath(assetPath, typeof(UnityEngine.Object));
299278
#else
300-
UnityEngine.Object asset = null;
301279
AssetLogHelper.LogError("加载资源: " + assetPath + " 失败(资源加载Develop模式只能在编辑器下运行)");
280+
return null;
302281
#endif
303-
return asset;
304282
}
305-
LoadHandler loadHandler = null;
306283
if (!BundleNameToRuntimeInfo.TryGetValue(bundlePackageName, out BundleRuntimeInfo bundleRuntimeInfo))
307284
{
308285
AssetLogHelper.LogError(bundlePackageName + "分包没有初始化");
309286
return null;
310287
}
311-
if (!bundleRuntimeInfo.AllAssetLoadHandler.TryGetValue(assetPath, out loadHandler))
288+
if (!bundleRuntimeInfo.AllAssetLoadHandler.TryGetValue(assetPath, out LoadHandler loadHandler))
312289
{
313290
loadHandler = LoadHandlerFactory.GetLoadHandler(assetPath, bundlePackageName, true, true);
314291
bundleRuntimeInfo.AllAssetLoadHandler.Add(assetPath, loadHandler);
315292
bundleRuntimeInfo.UnLoadHandler.Add(loadHandler.UniqueId, loadHandler);
316293
}
294+
//加载资源
295+
CoroutineLock coroutineLock = await CoroutineLockComponent.Wait(CoroutineLockType.BundleMaster, LoadPathConvertHelper.LoadPathConvert("UnityObject|" + assetPath));
317296
if (loadHandler.LoadState == LoadState.NoLoad)
318297
{
319-
ETTask tcs = ETTask.Create(true);
320-
loadHandler.AwaitEtTasks.Add(tcs);
321298
await loadHandler.LoadAsync();
322299
AssetBundleRequest loadAssetAsync = loadHandler.FileAssetBundle.LoadAssetAsync(assetPath);
323300
loadAssetAsync.completed += operation =>
324301
{
325302
loadHandler.Asset = loadAssetAsync.asset;
326-
for (int i = 0; i < loadHandler.AwaitEtTasks.Count; i++)
327-
{
328-
ETTask etTask = loadHandler.AwaitEtTasks[i];
329-
etTask.SetResult();
330-
}
331-
loadHandler.AwaitEtTasks.Clear();
332303
};
333-
await tcs;
334-
return loadHandler.Asset;
335-
}
336-
else if (loadHandler.LoadState == LoadState.Loading)
337-
{
338-
ETTask tcs = ETTask.Create(true);
339-
loadHandler.AwaitEtTasks.Add(tcs);
340-
await tcs;
341-
return loadHandler.Asset;
342-
}
343-
else
344-
{
345-
return loadHandler.Asset;
346304
}
305+
coroutineLock.Dispose();
306+
return loadHandler.Asset;
347307
}
348308

349309
/// <summary>

Assets/BundleMaster/BundleMasterRuntime/Base/LoadBaseRuntimeLoad.cs

Lines changed: 33 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,7 @@ public partial class LoadBase
2424
/// <summary>
2525
/// AssetBundle的引用
2626
/// </summary>
27-
public AssetBundle AssetBundle;
28-
29-
/// <summary>
30-
/// 加载完成后需要执行的Task
31-
/// </summary>
32-
private List<ETTask> _loadFinishTasks = new List<ETTask>();
27+
public AssetBundle AssetBundle = null;
3328

3429
/// <summary>
3530
/// 需要统计进度
@@ -82,7 +77,7 @@ internal void LoadAssetBundle(string bundlePackageName)
8277
return;
8378
}
8479
}
85-
80+
//资源没有加载过也没有正在加载就同步加载出来
8681
if (AssetComponent.BundleNameToRuntimeInfo[bundlePackageName].Encrypt)
8782
{
8883
string assetBundlePath = AssetComponent.BundleFileExistPath(bundlePackageName, AssetBundleName, true);
@@ -95,103 +90,86 @@ internal void LoadAssetBundle(string bundlePackageName)
9590
AssetBundle = AssetBundle.LoadFromFile(assetBundlePath);
9691
}
9792
_loadState = LoadState.Finish;
98-
for (int i = 0; i < _loadFinishTasks.Count; i++)
99-
{
100-
_loadFinishTasks[i].SetResult();
101-
}
102-
_loadFinishTasks.Clear();
10393
}
10494

105-
internal async ETTask LoadAssetBundleAsync(ETTask tcs, string bundlePackageName)
95+
/// <summary>
96+
/// 异步加载LoadBase的AssetBundle
97+
/// </summary>
98+
internal async ETTask LoadAssetBundleAsync(string bundlePackageName)
10699
{
107100
AddRefCount();
108101
if (_loadState == LoadState.Finish)
109102
{
110-
tcs.SetResult();
111-
return;
112-
}
113-
114-
115-
string path = AssetComponent.BundleFileExistPath(bundlePackageName, AssetBundleName, true);
116-
CoroutineLock coroutineLock = await CoroutineLockComponent.Wait(CoroutineLockType.BundleMaster, LoadPathConvertHelper.LoadPathConvert(path));
117-
118-
coroutineLock.Dispose();
119-
120-
121-
if (_loadState == LoadState.Loading)
122-
{
123-
_loadFinishTasks.Add(tcs);
124103
return;
125104
}
126-
_loadFinishTasks.Add(tcs);
127-
_loadState = LoadState.Loading;
128-
129-
if (AssetComponent.BundleNameToRuntimeInfo[bundlePackageName].Encrypt)
130-
{
131-
string assetBundlePath = AssetComponent.BundleFileExistPath(bundlePackageName, AssetBundleName, true);
132-
await LoadDataFinish(assetBundlePath, bundlePackageName);
133-
}
134-
else
105+
BundleRuntimeInfo bundleRuntimeInfo = AssetComponent.BundleNameToRuntimeInfo[bundlePackageName];
106+
string assetBundlePath = AssetComponent.BundleFileExistPath(bundlePackageName, AssetBundleName, bundleRuntimeInfo.Encrypt);
107+
//获取一个协程锁
108+
CoroutineLock coroutineLock = await CoroutineLockComponent.Wait(CoroutineLockType.BundleMaster, LoadPathConvertHelper.LoadPathConvert(assetBundlePath));
109+
if (_loadState == LoadState.NoLoad)
135110
{
136-
string assetBundlePath = AssetComponent.BundleFileExistPath(bundlePackageName, AssetBundleName, false);
137-
LoadBundleFinish(assetBundlePath);
111+
_loadState = LoadState.Loading;
112+
if (bundleRuntimeInfo.Encrypt)
113+
{
114+
await LoadDataFinish(assetBundlePath, bundleRuntimeInfo.SecretKey);
115+
}
116+
else
117+
{
118+
await LoadBundleFinish(assetBundlePath);
119+
}
120+
_loadState = LoadState.Finish;
138121
}
122+
//协程锁解锁
123+
coroutineLock.Dispose();
139124
}
140125

141126
/// <summary>
142127
/// 通过Byte加载完成(只有启用了异或加密才使用此加载方式)
143128
/// </summary>
144-
private async ETTask LoadDataFinish(string assetBundlePath, string bundlePackageName)
129+
private async ETTask LoadDataFinish(string assetBundlePath, char[] bundlePackageSecretKey)
145130
{
146-
byte[] data = await VerifyHelper.GetDecryptDataAsync(assetBundlePath, _loadProgress, AssetComponent.BundleNameToRuntimeInfo[bundlePackageName].SecretKey);
131+
byte[] data = await VerifyHelper.GetDecryptDataAsync(assetBundlePath, _loadProgress, bundlePackageSecretKey);
147132
if (_loadState == LoadState.Finish)
148133
{
149134
return;
150135
}
136+
ETTask tcs = ETTask.Create(true);
151137
_assetBundleCreateRequest = AssetBundle.LoadFromMemoryAsync(data);
152138
_assetBundleCreateRequest.completed += operation =>
153139
{
154140
AssetBundle = _assetBundleCreateRequest.assetBundle;
155-
for (int i = 0; i < _loadFinishTasks.Count; i++)
156-
{
157-
_loadFinishTasks[i].SetResult();
158-
}
159-
_loadFinishTasks.Clear();
160-
_loadState = LoadState.Finish;
141+
tcs.SetResult();
161142
//判断是否还需要
162143
if (_refCount <= 0)
163144
{
164145
AssetComponent.AddPreUnLoadPool(this);
165146
}
166147
};
148+
await tcs;
167149
}
168150

169151
/// <summary>
170152
/// 通过路径直接加载硬盘上的AssetBundle
171153
/// </summary>
172-
/// <param name="assetBundlePath"></param>
173-
private void LoadBundleFinish(string assetBundlePath)
154+
private async ETTask LoadBundleFinish(string assetBundlePath)
174155
{
175156
if (_loadState == LoadState.Finish)
176157
{
177158
return;
178159
}
160+
ETTask tcs = ETTask.Create(true);
179161
_assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(assetBundlePath);
180162
_assetBundleCreateRequest.completed += operation =>
181163
{
182164
AssetBundle = _assetBundleCreateRequest.assetBundle;
183-
for (int i = 0; i < _loadFinishTasks.Count; i++)
184-
{
185-
_loadFinishTasks[i].SetResult();
186-
}
187-
_loadFinishTasks.Clear();
188-
_loadState = LoadState.Finish;
165+
tcs.SetResult();
189166
//判断是否还需要
190167
if (_refCount <= 0)
191168
{
192169
AssetComponent.AddPreUnLoadPool(this);
193170
}
194171
};
172+
await tcs;
195173
}
196174

197175
/// <summary>
@@ -213,7 +191,7 @@ internal void ForceLoadFinish(string bundlePackageName)
213191

214192
if (AssetComponent.BundleNameToRuntimeInfo[bundlePackageName].Encrypt)
215193
{
216-
string assetBundlePath = AssetComponent.BundleFileExistPath(bundlePackageName, AssetBundleName, true);
194+
string assetBundlePath = AssetComponent.BundleFileExistPath(bundlePackageName, AssetBundleName, AssetComponent.BundleNameToRuntimeInfo[bundlePackageName].Encrypt);
217195
byte[] data = VerifyHelper.GetDecryptData(assetBundlePath, AssetComponent.BundleNameToRuntimeInfo[bundlePackageName].SecretKey);
218196
AssetBundle = AssetBundle.LoadFromMemory(data);
219197
}
@@ -222,11 +200,6 @@ internal void ForceLoadFinish(string bundlePackageName)
222200
string assetBundlePath = AssetComponent.BundleFileExistPath(bundlePackageName, AssetBundleName, false);
223201
AssetBundle = AssetBundle.LoadFromFile(assetBundlePath);
224202
}
225-
for (int i = 0; i < _loadFinishTasks.Count; i++)
226-
{
227-
_loadFinishTasks[i].SetResult();
228-
}
229-
_loadFinishTasks.Clear();
230203
_loadState = LoadState.Finish;
231204
//判断是否还需要
232205
if (_refCount <= 0)

Assets/BundleMaster/BundleMasterRuntime/LoadHandler.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,6 @@ public event Action<LoadHandler> Completed
3737
/// 加载的状态
3838
/// </summary>
3939
internal LoadState LoadState = LoadState.NoLoad;
40-
41-
/// <summary>
42-
/// 异步等待加载的Task
43-
/// </summary>
44-
internal List<ETTask> AwaitEtTasks = new List<ETTask>();
45-
4640

4741
internal LoadHandler(bool isPool)
4842
{

Assets/BundleMaster/BundleMasterRuntime/LoadHandlerBase.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,7 @@ public abstract class LoadHandlerBase
6666
/// </summary>
6767
protected async ETTask LoadAsyncLoader(LoadBase loadBase, ETTask baseTcs)
6868
{
69-
ETTask tcs = ETTask.Create(true);
70-
loadBase.LoadAssetBundleAsync(tcs, BundlePackageName).Coroutine();
71-
await tcs;
69+
await loadBase.LoadAssetBundleAsync(BundlePackageName);
7270
RefLoadFinishCount--;
7371
if (RefLoadFinishCount == 0)
7472
{

Assets/BundleMaster/CoroutineLock/CoroutineLockType.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
{
33
public enum CoroutineLockType
44
{
5+
/// <summary>
6+
/// BundleMaster资源加载用的标识符
7+
/// </summary>
58
BundleMaster = 0,
69

710
}

0 commit comments

Comments
 (0)