123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- using Cysharp.Threading.Tasks;
- using HybridCLR;
- using Sirenix.Utilities;
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Drawing;
- using System.IO;
- using System.Reflection;
- using UnityEngine;
- using YooAsset;
- namespace ET
- {
- public class CodeLoader: Singleton<CodeLoader>
- {
- public void Start()
- {
- AsyncLoadResAndCode().Forget();
- }
- private async UniTaskVoid AsyncLoadResAndCode()
- {
- YooAssets.EPlayMode playMode;
- if (Define.EnableCodes)
- {
- playMode = YooAssets.EPlayMode.EditorSimulateMode;
- }
- else
- {
- GlobalConfig globalConfig = Resources.Load<GlobalConfig>("GlobalConfig");
- playMode = globalConfig.PlayMode;
- }
- Log.Info($"start mode: {playMode}");
-
- await YooAssetProxy.StartYooAssetEngine(playMode);
-
- ShaderVariantCollection shaderVariantCollection =
- (await YooAssetProxy.LoadAssetAsync<ShaderVariantCollection>(
- YooAssetProxy.GetYooAssetFormatResPath("ProjectSShaderVariant",
- YooAssetProxy.YooAssetResType.Shader)))
- .GetAssetObject<ShaderVariantCollection>();
- Stopwatch stopwatch = Stopwatch.StartNew();
- shaderVariantCollection.WarmUp();
- stopwatch.Stop();
- Log.Info($"Shader Warm Up完成, 耗时: {stopwatch.ElapsedMilliseconds}ms,shaderCount: {shaderVariantCollection.shaderCount} variantCount: {shaderVariantCollection.variantCount}");
-
- if (Define.EnableCodes)
- {
- LoadLocalCode();
- }
- else
- {
- await LoadMetadataForAOT();
- await LoadHotfixCode();
- }
- }
-
- private async UniTask LoadMetadataForAOT()
- {
-
- ConfigStringList hotUpdateAOTDlls =
- (await YooAssetProxy.LoadAssetAsync<ConfigStringList>("HotUpdateAOTDlls"))
- .GetAssetObject<ConfigStringList>();
- List<UniTask<RawFileOperation>> tasks = new List<UniTask<RawFileOperation>>();
- foreach (var aotDll in hotUpdateAOTDlls.List)
- {
- tasks.Add(YooAssetProxy.GetRawFileAsync(aotDll));
- }
- RawFileOperation[] rawFileOperations = await UniTask.WhenAll(tasks);
- foreach (var task in rawFileOperations)
- {
- var ret = RuntimeApi.LoadMetadataForAOTAssembly(task.GetRawBytes(), HomologousImageMode.SuperSet);
- if (ret != LoadImageErrorCode.OK)
- {
- Log.Error($"Error occurs when loadMetadataForAOT: {ret}");
- }
- }
- }
-
- private async UniTask LoadHotfixCode()
- {
- Dictionary<string, Type> typesInAssembly = new Dictionary<string, Type>();
- Assembly modelAss = null;
- #if ! UNITY_EDITOR
- var battleDlls = (await YooAssetProxy.LoadAssetAsync<ConfigStringList>("HotupdateBattleDlls")).GetAssetObject<ConfigStringList>();
- foreach (var dll in battleDlls.List)
- {
- Log.Info($"to load: {dll}");
- Assembly.Load((await YooAssetProxy.GetRawFileAsync(dll)).GetRawBytes());
- }
- #endif
- var hotDlls = (await YooAssetProxy.LoadAssetAsync<ConfigKeyValueMap>("HotupdateDlls")).GetAssetObject<ConfigKeyValueMap>();
- foreach(var kv in hotDlls.keyValueMaps)
- {
- Assembly ass;
- if(kv.Value.IsNullOrWhitespace())
- {
- Log.Info($"to load: {kv.Key}");
- ass = Assembly.Load((await YooAssetProxy.GetRawFileAsync(kv.Key)).GetRawBytes());
- }
- else
- {
- Log.Info($"to load: {kv.Key}");
- ass = Assembly.Load((await YooAssetProxy.GetRawFileAsync(kv.Key)).GetRawBytes(),
- (await YooAssetProxy.GetRawFileAsync(kv.Value)).GetRawBytes());
- }
- foreach (Type type in ass.GetTypes())
- {
- typesInAssembly[type.FullName] = type;
- }
- if(kv.Key.Equals("Model.dll"))
- {
- modelAss = ass;
- }
- }
- EventSystem.Instance.Add(typesInAssembly);
- if(modelAss == null)
- {
- Log.Error("Not Found 'Model.dll'! ");
- return;
- }
- Log.Info("to call Client.Entry.");
- IStaticMethod start = new MonoStaticMethod(modelAss, "ET.Entry", "Start");
- start.Run();
- }
-
- private void LoadLocalCode()
- {
-
-
-
-
-
- Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
- Dictionary<string, Type> types = AssemblyHelper.GetAssemblyTypes(assemblies);
- EventSystem.Instance.Add(types);
- bool bStart = false;
- foreach (Assembly ass in assemblies)
- {
- string name = ass.GetName().Name;
- if (name == "Unity.Model.Codes")
- {
- bStart = true;
- IStaticMethod start = new StaticMethod(ass, "ET.Entry", "Start");
- start.Run();
- break;
- }
- }
- if (!bStart)
- {
- throw new Exception("not found Assembly: 'Unity.Model.Codes'");
- }
- }
-
- public void LoadHotfix()
- {
-
- var xx = ImageConversion.EnableLegacyPngGammaRuntimeLoadBehavior;
- Image x = Image.FromFile("");
- }
- }
- }
|