EP 实验性框架

This commit is contained in:
2025-11-20 16:17:10 +08:00
parent bf81df9581
commit 18442ae51c
5 changed files with 530 additions and 78 deletions

View File

@@ -6,70 +6,90 @@ namespace Convention.Experimental
{
public static class Architecture
{
private static readonly LinkedCacheList<GameModule> s_GameFrameworkModules = new();
private static readonly LinkedCacheList<object> s_GameFrameworkModules = new();
/// <summary>
/// <20><><EFBFBD><EFBFBD><see cref="GameModule"/>
/// <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="moduleType">Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><see cref="GameModule"/><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><see cref="GameModule"/></returns>
private static GameModule CreateModule(Type moduleType, int stackLayer = 0)
/// <param name="instanceType">Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns>Ŀ<EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD></returns>
private static object Create(Type instanceType, int stackLayer = 0)
{
if (stackLayer >= 100)
{
throw new GameException($"Create module '{moduleType.FullName}' failed, recursion too deep, there may be a circular dependency.");
throw new GameException($"Create instance '{instanceType.FullName}' failed, recursion too deep, there may be a circular dependency.");
}
GameModule module = (GameModule)Activator.CreateInstance(moduleType);
if (module == null)
object instance = Activator.CreateInstance(instanceType);
if (instance == null)
{
throw new GameException($"Can not create module '{moduleType.FullName}'");
throw new GameException($"Can not create instance '{instanceType.FullName}'");
}
// <20>ݹ鴴<DDB9><E9B4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
foreach (var dependenceType in module.Dependences())
_ = GetModule(dependenceType, stackLayer + 1);
LinkedListNode<GameModule> current = s_GameFrameworkModules.First;
while (current != null)
if (instance is GameModule module)
{
if (module.Priority > current.Value.Priority)
// <20>ݹ鴴<DDB9><E9B4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
foreach (var dependenceType in module.Dependences())
_ = Get(dependenceType, stackLayer + 1);
var current = s_GameFrameworkModules.First;
while (current != null)
{
break;
if (current.Value is GameModule nextModule && module.Priority > nextModule.Priority)
{
break;
}
current = current.Next;
}
current = current.Next;
if (current != null)
{
s_GameFrameworkModules.AddBefore(current, module);
}
else
{
s_GameFrameworkModules.AddLast(module);
}
}
if (current != null)
{
s_GameFrameworkModules.AddBefore(current, module);
}
else
{
s_GameFrameworkModules.AddLast(module);
}
return module;
return instance;
}
/// <summary>
/// <20><>ȡ<see cref="GameModule"/>
/// <20><>ȡʵ<EFBFBD><EFBFBD>
/// </summary>
/// <param name="moduleType">Ҫ<><D2AA>ȡ<EFBFBD><C8A1><see cref="GameModule"/></param>
/// <returns>Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><see cref="GameModule"/></returns>
/// <remarks><3E><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><see cref="GameModule"/><3E><><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><see cref="GameModule"/>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD></remarks>
private static GameModule GetModule(Type moduleType, int stackLayer = 0)
/// <param name="instanceType">Ҫ<><D2AA>ȡ<EFBFBD><C8A1>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns>ʵ<EFBFBD><EFBFBD></returns>
/// <remarks><3E><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD></remarks>
public static object Get(Type instanceType, int stackLayer = 0)
{
foreach (GameModule module in s_GameFrameworkModules)
foreach (object obj in s_GameFrameworkModules)
{
if (module.GetType() == moduleType)
if (obj.GetType() == instanceType)
{
return module;
return obj;
}
}
return CreateModule(moduleType, stackLayer + 1);
return Create(instanceType, stackLayer + 1);
}
/// <summary>
/// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
/// </summary>
/// <param name="type">Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns>ʵ<><CAB5><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD></returns>
public static bool Contains(Type type)
{
foreach (object obj in s_GameFrameworkModules)
{
if (obj.GetType() == type)
{
return true;
}
}
return false;
}
/// <summary>
@@ -80,7 +100,7 @@ namespace Convention.Experimental
/// <remarks><3E><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B2BB><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>ģ<EFBFBD>顣</remarks>
public static T GetModule<T>() where T : GameModule
{
return (T)GetModule(typeof(T));
return (T)Get(typeof(T));
}
/// <summary>
@@ -90,7 +110,8 @@ namespace Convention.Experimental
{
for (var current = s_GameFrameworkModules.Last; current != null; current = current.Previous)
{
current.Value.Shutdown();
if (current.Value is GameModule module)
module.Shutdown();
}
s_GameFrameworkModules.Clear();
@@ -105,9 +126,10 @@ namespace Convention.Experimental
/// <param name="realElapseSeconds"><3E><>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>λ<EFBFBD><CEBB></param>
public static void Update(float elapseSeconds, float realElapseSeconds)
{
foreach (var module in s_GameFrameworkModules)
foreach (object obj in s_GameFrameworkModules)
{
module.Update(elapseSeconds, realElapseSeconds);
if (obj is GameModule module)
module.Update(elapseSeconds, realElapseSeconds);
}
}
}