1
This commit is contained in:
@@ -35,9 +35,11 @@ public class MonsterMoveLine
|
||||
public Vector2 end;
|
||||
}
|
||||
|
||||
public static async Task LoadBezier()
|
||||
/// <summary>加载当前玩法路线。onProgress:0~1 进度回调(供进房进度条;路线文本可能和鱼资源在同一个大包里,
|
||||
/// 包的解压耗时会体现在这里,避免大包场景进度条失真)</summary>
|
||||
public static async Task LoadBezier(Action<float> onProgress = null)
|
||||
{
|
||||
await LoadBezierTxtAsync("MoveLine");
|
||||
await LoadBezierTxtAsync("MoveLine", onProgress);
|
||||
}
|
||||
public static async Task UnLoadBezier()
|
||||
{
|
||||
@@ -155,7 +157,16 @@ public class MonsterMoveLine
|
||||
return knots;
|
||||
}
|
||||
|
||||
public static async Task LoadBezierTxtAsync(string path)
|
||||
/// <summary>
|
||||
/// ⭐ 路线加载句柄(保留到离房才释放):
|
||||
/// 路线文本常和鱼资源打在同一个大包里。旧实现"读完文本立即 Release",
|
||||
/// 单一大包场景下引用归零 → 大包立即卸载 → LoadFishAssetsData 又重新加载同一个包
|
||||
/// (同一个 LZMA 大包解压两次 + 内存暴涨→回落→再暴涨的过山车)。
|
||||
/// 现在句柄保留,与鱼包句柄共存,离房 UnLoadBezierTxtAsync 统一释放。
|
||||
/// </summary>
|
||||
private static AsyncOperationHandle<IList<TextAsset>> _bezierHandles;
|
||||
|
||||
public static async Task LoadBezierTxtAsync(string path, Action<float> onProgress = null)
|
||||
{
|
||||
// ⭐ 加载前先全量清空上一场的路线缓存:
|
||||
// 各玩法普通路线/鱼阵曲线名完全重名(曲线1~N、鱼阵N)但坐标不同,
|
||||
@@ -167,29 +178,50 @@ public class MonsterMoveLine
|
||||
keys.Add(path);
|
||||
keys.Add(GameManager.Instance.gameData.currGameType.ToString());
|
||||
|
||||
AsyncOperationHandle<IList<TextAsset>> handles = Addressables.LoadAssetsAsync<TextAsset>(
|
||||
// ⭐ 防御:上一轮句柄未释放(如离房流程被跳过)时先释放,避免引用计数累加
|
||||
if (_bezierHandles.IsValid())
|
||||
Addressables.Release(_bezierHandles);
|
||||
|
||||
_bezierHandles = Addressables.LoadAssetsAsync<TextAsset>(
|
||||
keys, null, Addressables.MergeMode.Intersection);
|
||||
await handles.Task;
|
||||
|
||||
// ⭐ 轮询上报进度(0~85% 为加载段):路线文本常和鱼资源打在同一个大包里,
|
||||
// 大包的解压耗时发生在这里,必须反映到进度条(否则单一大包场景进度失真:
|
||||
// 卡在路线段不动,后面的"鱼包段"反而秒过)。无回调时直接等完成。
|
||||
if (onProgress != null)
|
||||
{
|
||||
while (!_bezierHandles.IsDone)
|
||||
{
|
||||
onProgress(0.85f * _bezierHandles.PercentComplete);
|
||||
await Task.Delay(50);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
await _bezierHandles.Task;
|
||||
}
|
||||
|
||||
// ⭐ 没有资源 → 直接跳出,不报错(缓存已清空,保持干净状态)
|
||||
if (handles.Result == null || handles.Result.Count == 0)
|
||||
// 句柄保留(离房统一释放),防止路线与鱼同包时提前卸掉大包
|
||||
if (_bezierHandles.Result == null || _bezierHandles.Result.Count == 0)
|
||||
{
|
||||
Debug.LogWarning($"Bezier 曲线加载跳过:未找到标签 {path} + {GameManager.Instance.gameData.currGameType}");
|
||||
Addressables.Release(handles);
|
||||
onProgress?.Invoke(1f);
|
||||
return;
|
||||
}
|
||||
|
||||
// ⭐ 主线程只做 Unity API 访问:把每个 TextAsset 的 name/text 读成纯托管字符串后立即释放句柄。
|
||||
// .text 返回托管 string 拷贝,释放句柄后仍可安全在后台线程使用。
|
||||
int fileCount = handles.Result.Count;
|
||||
// ⭐ 主线程只做 Unity API 访问:把每个 TextAsset 的 name/text 读成纯托管字符串。
|
||||
// .text 返回托管 string 拷贝,句柄保留期间数据稳定,后台线程可安全使用。
|
||||
// (句柄不再立即 Release —— 路线与鱼同包时提前释放会把整个大包卸掉)
|
||||
int fileCount = _bezierHandles.Result.Count;
|
||||
string[] fileNames = new string[fileCount];
|
||||
string[] fileTexts = new string[fileCount];
|
||||
for (int i = 0; i < fileCount; i++)
|
||||
{
|
||||
fileNames[i] = handles.Result[i].name;
|
||||
fileTexts[i] = handles.Result[i].text;
|
||||
fileNames[i] = _bezierHandles.Result[i].name;
|
||||
fileTexts[i] = _bezierHandles.Result[i].text;
|
||||
}
|
||||
Addressables.Release(handles);
|
||||
onProgress?.Invoke(0.88f);
|
||||
|
||||
// ⭐ 座位镜像状态主线程读一次传入后台(后台线程不访问任何 Unity/游戏静态状态)
|
||||
bool mirrored = SeatMirror.IsMirrored;
|
||||
@@ -212,6 +244,7 @@ public class MonsterMoveLine
|
||||
dic_BezierCurveDatas[curve.name] = curve;
|
||||
BuildCurvePointsArray(curve);
|
||||
}
|
||||
onProgress?.Invoke(1f);
|
||||
|
||||
// ⭐ 座位镜像状态提示:镜像未初始化(-1)时按不镜像处理,排查进房时序问题用
|
||||
if (SeatMirror.LocalServerPos < 0)
|
||||
@@ -292,6 +325,12 @@ public class MonsterMoveLine
|
||||
|
||||
public static async Task UnLoadBezierTxtAsync(string path)
|
||||
{
|
||||
// ⭐ 释放路线加载句柄(与鱼包句柄共同归零后,路线/鱼共用的大包才真正卸载)
|
||||
if (_bezierHandles.IsValid())
|
||||
{
|
||||
Addressables.Release(_bezierHandles);
|
||||
}
|
||||
|
||||
// ⭐ 全量同步清空,不再按 currGameType 重查 Addressables 删除:
|
||||
// 1. 卸载依赖 currGameType 有时序风险 —— 选房面板在玩家点选新玩法时就改了全局类型,
|
||||
// 延迟执行的卸载(OnHide 补卸载/异常重跑)会按新玩法 txt 去删 → 旧玩法 Boss 路线全部残留;
|
||||
|
||||
Reference in New Issue
Block a user