|
|
@@ -6,8 +6,52 @@ using System.Text;
|
|
|
|
|
|
namespace ET
|
|
|
{
|
|
|
+ using OneTypeSystems = UnOrderMultiMap<Type, object>;
|
|
|
+
|
|
|
public sealed class EventSystem: IDisposable
|
|
|
{
|
|
|
+ private class TypeSystems
|
|
|
+ {
|
|
|
+ private readonly Dictionary<Type, OneTypeSystems> typeSystemsMap = new Dictionary<Type, OneTypeSystems>();
|
|
|
+
|
|
|
+ public OneTypeSystems GetOrCreateOneTypeSystems(Type type)
|
|
|
+ {
|
|
|
+ OneTypeSystems systems = null;
|
|
|
+ this.typeSystemsMap.TryGetValue(type, out systems);
|
|
|
+ if (systems != null)
|
|
|
+ {
|
|
|
+ return systems;
|
|
|
+ }
|
|
|
+
|
|
|
+ systems = new OneTypeSystems();
|
|
|
+ this.typeSystemsMap.Add(type, systems);
|
|
|
+ return systems;
|
|
|
+ }
|
|
|
+
|
|
|
+ public OneTypeSystems GetOneTypeSystems(Type type)
|
|
|
+ {
|
|
|
+ OneTypeSystems systems = null;
|
|
|
+ this.typeSystemsMap.TryGetValue(type, out systems);
|
|
|
+ return systems;
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<object> GetSystems(Type type, Type systemType)
|
|
|
+ {
|
|
|
+ OneTypeSystems oneTypeSystems = null;
|
|
|
+ if (!this.typeSystemsMap.TryGetValue(type, out oneTypeSystems))
|
|
|
+ {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!oneTypeSystems.TryGetValue(systemType, out List<object> systems))
|
|
|
+ {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return systems;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
private static EventSystem instance;
|
|
|
|
|
|
public static EventSystem Instance
|
|
|
@@ -25,23 +69,11 @@ namespace ET
|
|
|
private readonly UnOrderMultiMapSet<Type, Type> types = new UnOrderMultiMapSet<Type, Type>();
|
|
|
|
|
|
private readonly Dictionary<Type, List<object>> allEvents = new Dictionary<Type, List<object>>();
|
|
|
-
|
|
|
- private readonly UnOrderMultiMap<Type, IAwakeSystem> awakeSystems = new UnOrderMultiMap<Type, IAwakeSystem>();
|
|
|
-
|
|
|
- private readonly UnOrderMultiMap<Type, IDestroySystem> destroySystems = new UnOrderMultiMap<Type, IDestroySystem>();
|
|
|
-
|
|
|
- private readonly UnOrderMultiMap<Type, ILoadSystem> loadSystems = new UnOrderMultiMap<Type, ILoadSystem>();
|
|
|
-
|
|
|
- private readonly UnOrderMultiMap<Type, IUpdateSystem> updateSystems = new UnOrderMultiMap<Type, IUpdateSystem>();
|
|
|
-
|
|
|
- private readonly UnOrderMultiMap<Type, ILateUpdateSystem> lateUpdateSystems = new UnOrderMultiMap<Type, ILateUpdateSystem>();
|
|
|
|
|
|
- private readonly UnOrderMultiMap<Type, IDeserializeSystem> deserializeSystems = new UnOrderMultiMap<Type, IDeserializeSystem>();
|
|
|
+ private TypeSystems typeSystems = new TypeSystems();
|
|
|
|
|
|
private Queue<long> updates = new Queue<long>();
|
|
|
private Queue<long> updates2 = new Queue<long>();
|
|
|
-
|
|
|
- private readonly Queue<long> starts = new Queue<long>();
|
|
|
|
|
|
private Queue<long> loaders = new Queue<long>();
|
|
|
private Queue<long> loaders2 = new Queue<long>();
|
|
|
@@ -80,36 +112,16 @@ namespace ET
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- this.awakeSystems.Clear();
|
|
|
- this.lateUpdateSystems.Clear();
|
|
|
- this.updateSystems.Clear();
|
|
|
- this.loadSystems.Clear();
|
|
|
- this.destroySystems.Clear();
|
|
|
- this.deserializeSystems.Clear();
|
|
|
+ this.typeSystems = new TypeSystems();
|
|
|
|
|
|
foreach (Type type in this.GetTypes(typeof(ObjectSystemAttribute)))
|
|
|
{
|
|
|
object obj = Activator.CreateInstance(type);
|
|
|
- switch (obj)
|
|
|
- {
|
|
|
- case IAwakeSystem objectSystem:
|
|
|
- this.awakeSystems.Add(objectSystem.Type(), objectSystem);
|
|
|
- break;
|
|
|
- case IUpdateSystem updateSystem:
|
|
|
- this.updateSystems.Add(updateSystem.Type(), updateSystem);
|
|
|
- break;
|
|
|
- case ILateUpdateSystem lateUpdateSystem:
|
|
|
- this.lateUpdateSystems.Add(lateUpdateSystem.Type(), lateUpdateSystem);
|
|
|
- break;
|
|
|
- case IDestroySystem destroySystem:
|
|
|
- this.destroySystems.Add(destroySystem.Type(), destroySystem);
|
|
|
- break;
|
|
|
- case ILoadSystem loadSystem:
|
|
|
- this.loadSystems.Add(loadSystem.Type(), loadSystem);
|
|
|
- break;
|
|
|
- case IDeserializeSystem deserializeSystem:
|
|
|
- this.deserializeSystems.Add(deserializeSystem.Type(), deserializeSystem);
|
|
|
- break;
|
|
|
+
|
|
|
+ if (obj is ISystemType iSystemType)
|
|
|
+ {
|
|
|
+ OneTypeSystems oneTypeSystems = this.typeSystems.GetOrCreateOneTypeSystems(iSystemType.Type());
|
|
|
+ oneTypeSystems.Add(iSystemType.SystemType(), obj);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -132,6 +144,8 @@ namespace ET
|
|
|
|
|
|
this.Load();
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
|
|
|
public Assembly GetAssembly(string name)
|
|
|
{
|
|
|
@@ -173,17 +187,23 @@ namespace ET
|
|
|
|
|
|
Type type = component.GetType();
|
|
|
|
|
|
- if (this.loadSystems.ContainsKey(type))
|
|
|
+ OneTypeSystems oneTypeSystems = this.typeSystems.GetOneTypeSystems(type);
|
|
|
+ if (oneTypeSystems == null)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (oneTypeSystems.ContainsKey(typeof(ILoadSystem)))
|
|
|
{
|
|
|
this.loaders.Enqueue(component.InstanceId);
|
|
|
}
|
|
|
|
|
|
- if (this.updateSystems.ContainsKey(type))
|
|
|
+ if (oneTypeSystems.ContainsKey(typeof(IUpdateSystem)))
|
|
|
{
|
|
|
this.updates.Enqueue(component.InstanceId);
|
|
|
}
|
|
|
|
|
|
- if (this.lateUpdateSystems.ContainsKey(type))
|
|
|
+ if (oneTypeSystems.ContainsKey(typeof(ILateUpdateSystem)))
|
|
|
{
|
|
|
this.lateUpdates.Enqueue(component.InstanceId);
|
|
|
}
|
|
|
@@ -208,7 +228,7 @@ namespace ET
|
|
|
|
|
|
public void Deserialize(Entity component)
|
|
|
{
|
|
|
- List<IDeserializeSystem> iDeserializeSystems = this.deserializeSystems[component.GetType()];
|
|
|
+ List<object> iDeserializeSystems = this.typeSystems.GetSystems(component.GetType(), typeof (IDeserializeSystem));
|
|
|
if (iDeserializeSystems == null)
|
|
|
{
|
|
|
return;
|
|
|
@@ -234,7 +254,7 @@ namespace ET
|
|
|
|
|
|
public void Awake(Entity component)
|
|
|
{
|
|
|
- List<IAwakeSystem> iAwakeSystems = this.awakeSystems[component.GetType()];
|
|
|
+ List<object> iAwakeSystems = this.typeSystems.GetSystems(component.GetType(), typeof (IAwakeSystem));
|
|
|
if (iAwakeSystems == null)
|
|
|
{
|
|
|
return;
|
|
|
@@ -246,16 +266,10 @@ namespace ET
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
- IAwake iAwake = aAwakeSystem as IAwake;
|
|
|
- if (iAwake == null)
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
|
|
|
try
|
|
|
{
|
|
|
- iAwake.Run(component);
|
|
|
+ aAwakeSystem.Run(component);
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
@@ -266,28 +280,22 @@ namespace ET
|
|
|
|
|
|
public void Awake<P1>(Entity component, P1 p1)
|
|
|
{
|
|
|
- List<IAwakeSystem> iAwakeSystems = this.awakeSystems[component.GetType()];
|
|
|
+ List<object> iAwakeSystems = this.typeSystems.GetSystems(component.GetType(), typeof (IAwakeSystem<P1>));
|
|
|
if (iAwakeSystems == null)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- foreach (IAwakeSystem aAwakeSystem in iAwakeSystems)
|
|
|
+ foreach (IAwakeSystem<P1> aAwakeSystem in iAwakeSystems)
|
|
|
{
|
|
|
if (aAwakeSystem == null)
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
- IAwake<P1> iAwake = aAwakeSystem as IAwake<P1>;
|
|
|
- if (iAwake == null)
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
|
|
|
try
|
|
|
{
|
|
|
- iAwake.Run(component, p1);
|
|
|
+ aAwakeSystem.Run(component, p1);
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
@@ -298,28 +306,22 @@ namespace ET
|
|
|
|
|
|
public void Awake<P1, P2>(Entity component, P1 p1, P2 p2)
|
|
|
{
|
|
|
- List<IAwakeSystem> iAwakeSystems = this.awakeSystems[component.GetType()];
|
|
|
+ List<object> iAwakeSystems = this.typeSystems.GetSystems(component.GetType(), typeof (IAwakeSystem<P1, P2>));
|
|
|
if (iAwakeSystems == null)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- foreach (IAwakeSystem aAwakeSystem in iAwakeSystems)
|
|
|
+ foreach (IAwakeSystem<P1, P2> aAwakeSystem in iAwakeSystems)
|
|
|
{
|
|
|
if (aAwakeSystem == null)
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
- IAwake<P1, P2> iAwake = aAwakeSystem as IAwake<P1, P2>;
|
|
|
- if (iAwake == null)
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
|
|
|
try
|
|
|
{
|
|
|
- iAwake.Run(component, p1, p2);
|
|
|
+ aAwakeSystem.Run(component, p1, p2);
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
@@ -330,28 +332,22 @@ namespace ET
|
|
|
|
|
|
public void Awake<P1, P2, P3>(Entity component, P1 p1, P2 p2, P3 p3)
|
|
|
{
|
|
|
- List<IAwakeSystem> iAwakeSystems = this.awakeSystems[component.GetType()];
|
|
|
+ List<object> iAwakeSystems = this.typeSystems.GetSystems(component.GetType(), typeof (IAwakeSystem<P1, P2, P3>));
|
|
|
if (iAwakeSystems == null)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- foreach (IAwakeSystem aAwakeSystem in iAwakeSystems)
|
|
|
+ foreach (IAwakeSystem<P1, P2, P3> aAwakeSystem in iAwakeSystems)
|
|
|
{
|
|
|
if (aAwakeSystem == null)
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- IAwake<P1, P2, P3> iAwake = aAwakeSystem as IAwake<P1, P2, P3>;
|
|
|
- if (iAwake == null)
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
try
|
|
|
{
|
|
|
- iAwake.Run(component, p1, p2, p3);
|
|
|
+ aAwakeSystem.Run(component, p1, p2, p3);
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
@@ -362,28 +358,22 @@ namespace ET
|
|
|
|
|
|
public void Awake<P1, P2, P3, P4>(Entity component, P1 p1, P2 p2, P3 p3, P4 p4)
|
|
|
{
|
|
|
- List<IAwakeSystem> iAwakeSystems = this.awakeSystems[component.GetType()];
|
|
|
- if (iAwakeSystems == null)
|
|
|
- {
|
|
|
- return;
|
|
|
- }
|
|
|
+ List<object> iAwakeSystems = this.typeSystems.GetSystems(component.GetType(), typeof (IAwakeSystem<P1, P2, P3, P4>));
|
|
|
+ if (iAwakeSystems == null)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- foreach (IAwakeSystem aAwakeSystem in iAwakeSystems)
|
|
|
+ foreach (IAwakeSystem<P1, P2, P3, P4> aAwakeSystem in iAwakeSystems)
|
|
|
{
|
|
|
if (aAwakeSystem == null)
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- IAwake<P1, P2, P3, P4> iAwake = aAwakeSystem as IAwake<P1, P2, P3, P4>;
|
|
|
- if (iAwake == null)
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
try
|
|
|
{
|
|
|
- iAwake.Run(component, p1, p2, p3, p4);
|
|
|
+ aAwakeSystem.Run(component, p1, p2, p3, p4);
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
@@ -407,7 +397,7 @@ namespace ET
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- List<ILoadSystem> iLoadSystems = this.loadSystems[component.GetType()];
|
|
|
+ List<object> iLoadSystems = this.typeSystems.GetSystems(component.GetType(), typeof (ILoadSystem));
|
|
|
if (iLoadSystems == null)
|
|
|
{
|
|
|
continue;
|
|
|
@@ -433,7 +423,7 @@ namespace ET
|
|
|
|
|
|
public void Destroy(Entity component)
|
|
|
{
|
|
|
- List<IDestroySystem> iDestroySystems = this.destroySystems[component.GetType()];
|
|
|
+ List<object> iDestroySystems = this.typeSystems.GetSystems(component.GetType(), typeof (IDestroySystem));
|
|
|
if (iDestroySystems == null)
|
|
|
{
|
|
|
return;
|
|
|
@@ -472,7 +462,7 @@ namespace ET
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- List<IUpdateSystem> iUpdateSystems = this.updateSystems[component.GetType()];
|
|
|
+ List<object> iUpdateSystems = this.typeSystems.GetSystems(component.GetType(), typeof (IUpdateSystem));
|
|
|
if (iUpdateSystems == null)
|
|
|
{
|
|
|
continue;
|
|
|
@@ -510,13 +500,13 @@ namespace ET
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
- List<ILateUpdateSystem> iLateUpdateSystems = this.lateUpdateSystems[component.GetType()];
|
|
|
+
|
|
|
+ List<object> iLateUpdateSystems = this.typeSystems.GetSystems(component.GetType(), typeof (ILateUpdateSystem));
|
|
|
if (iLateUpdateSystems == null)
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
this.lateUpdates2.Enqueue(instanceId);
|
|
|
|
|
|
foreach (ILateUpdateSystem iLateUpdateSystem in iLateUpdateSystems)
|