| | |
| | | int iterator = 0;
|
| | | int totalConfigs = configTypes.Count;
|
| | |
|
| | | #if UNITY_WEBGL && !UNITY_EDITOR
|
| | | // ============================================================
|
| | | // WebGL 优化:两阶段加载
|
| | | // 阶段1: 一次性并发发起所有 TextAsset 加载(同 bundle 只下载一次)
|
| | | // 阶段2: 从内存中分批解析,每批 Yield 防止浏览器卡死
|
| | | // ============================================================
|
| | |
|
| | | // 阶段1: 并发加载所有配置文本到内存
|
| | | Debug.Log("[ConfigManager] WebGL 阶段1: 批量加载配置文件...");
|
| | | var configList = configTypes.ToList();
|
| | | var configDataMap = new Dictionary<Type, string[]>(totalConfigs);
|
| | | var loadTasks = new List<UniTask>(totalConfigs);
|
| | |
|
| | | foreach (var configType in configList)
|
| | | {
|
| | | var ct = configType; // closure capture
|
| | | loadTasks.Add(LoadConfigTextAsync(ct).ContinueWith(texts =>
|
| | | {
|
| | | if (texts != null)
|
| | | configDataMap[ct] = texts;
|
| | | else
|
| | | Debug.LogError($"找不到配置文件: {ct.Name}");
|
| | | }));
|
| | | }
|
| | | await UniTask.WhenAll(loadTasks);
|
| | | loadingProgress = 0.5f; // 网络加载完成 50%
|
| | | Debug.Log($"[ConfigManager] WebGL 阶段1完成: {configDataMap.Count}/{totalConfigs} 个配置已加载到内存");
|
| | |
|
| | | // 阶段2: 从内存中分批解析初始化
|
| | | const int parseBatchSize = 10;
|
| | | int parsed = 0;
|
| | | foreach (var configType in configList)
|
| | | {
|
| | | if (configDataMap.TryGetValue(configType, out var texts))
|
| | | {
|
| | | InitConfigFromTexts(configType, texts);
|
| | | }
|
| | | parsed++;
|
| | | loadingProgress = 0.5f + 0.5f * parsed / totalConfigs;
|
| | |
|
| | | // 每 parseBatchSize 个让出主线程
|
| | | if (parsed % parseBatchSize == 0)
|
| | | await UniTask.Yield();
|
| | | }
|
| | | #else
|
| | | List<UniTask> loadTasks = new List<UniTask>();
|
| | |
|
| | | // 逐个加载配置并更新进度
|
| | |
| | | sw.Stop();
|
| | | #endif
|
| | |
|
| | | loadingProgress = (float)(iterator++ + 1) / totalConfigs;
|
| | | loadingProgress = (float)(++iterator) / totalConfigs;
|
| | | });
|
| | |
|
| | | loadTasks.Add(uniTask);
|
| | |
| | | }
|
| | |
|
| | | await UniTask.WhenAll(loadTasks);
|
| | | #endif
|
| | |
|
| | | // 加载完成后设置isLoadFinished为true
|
| | | loadingProgress = 1f;
|
| | |
| | | ClearConfigDictionary<ZhanlingConfig>();
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// 只加载配置文本,不做解析。用于 WebGL 批量预加载。
|
| | | /// </summary>
|
| | | private async UniTask<string[]> LoadConfigTextAsync(Type configType)
|
| | | {
|
| | | string configName = configType.Name;
|
| | | if (configName.EndsWith("Config"))
|
| | | configName = configName.Substring(0, configName.Length - 6);
|
| | | return await ResManager.Instance.LoadConfigAsync(configName);
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// 从已加载的文本初始化配置(纯内存操作,无网络)。
|
| | | /// </summary>
|
| | | private void InitConfigFromTexts(Type configType, string[] texts)
|
| | | {
|
| | | var methodInfo = configType.GetMethod("Init",
|
| | | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.FlattenHierarchy);
|
| | | if (methodInfo != null)
|
| | | {
|
| | | methodInfo.Invoke(null, new object[] { texts });
|
| | | var isInitField = configType.GetField("isInit",
|
| | | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
|
| | | if (isInitField != null)
|
| | | isInitField.SetValue(null, true);
|
| | | }
|
| | | else
|
| | | {
|
| | | Debug.LogError($"配置类 {configType.Name} 没有静态Init方法");
|
| | | }
|
| | | }
|
| | |
|
| | | }
|