提交 4515a5e3 编写于 作者: T tanghai

简化对象事件系统

上级 a0c38233
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
using Base; using Base;
using Model; using Model;
using NLog; using NLog;
using Object = Model.Object;
namespace App namespace App
{ {
...@@ -12,8 +11,8 @@ namespace App ...@@ -12,8 +11,8 @@ namespace App
{ {
try try
{ {
Object.ObjectManager.Register("Model", typeof(Game).Assembly); ObjectManager.Instance.Register("Model", typeof(Game).Assembly);
Object.ObjectManager.Register("Controller", DllHelper.GetController()); ObjectManager.Instance.Register("Controller", DllHelper.GetController());
StartConfig startConfig = Game.Scene.AddComponent<StartConfigComponent, string[]>(args).MyConfig; StartConfig startConfig = Game.Scene.AddComponent<StartConfigComponent, string[]>(args).MyConfig;
...@@ -67,7 +66,7 @@ namespace App ...@@ -67,7 +66,7 @@ namespace App
while (true) while (true)
{ {
Object.ObjectManager.Update(); ObjectManager.Instance.Update();
} }
} }
catch (Exception e) catch (Exception e)
......
using System; using System;
using Base; using Base;
using Model; using Model;
using Object = Model.Object;
namespace Controller namespace Controller
{ {
...@@ -13,7 +12,7 @@ namespace Controller ...@@ -13,7 +12,7 @@ namespace Controller
A2M_Reload a2MReload = new A2M_Reload(); A2M_Reload a2MReload = new A2M_Reload();
try try
{ {
Object.ObjectManager.Register("Controller", DllHelper.GetController()); ObjectManager.Instance.Register("Controller", DllHelper.GetController());
} }
catch (Exception e) catch (Exception e)
{ {
......
...@@ -173,9 +173,6 @@ ...@@ -173,9 +173,6 @@
<Compile Include="..\..\Unity\Assets\Scripts\Object\ILoader.cs"> <Compile Include="..\..\Unity\Assets\Scripts\Object\ILoader.cs">
<Link>Object\ILoader.cs</Link> <Link>Object\ILoader.cs</Link>
</Compile> </Compile>
<Compile Include="..\..\Unity\Assets\Scripts\Object\IStart.cs">
<Link>Object\IStart.cs</Link>
</Compile>
<Compile Include="..\..\Unity\Assets\Scripts\Object\IUpdate.cs"> <Compile Include="..\..\Unity\Assets\Scripts\Object\IUpdate.cs">
<Link>Object\IUpdate.cs</Link> <Link>Object\IUpdate.cs</Link>
</Compile> </Compile>
......
...@@ -3,7 +3,6 @@ using Base; ...@@ -3,7 +3,6 @@ using Base;
using UnityEditor; using UnityEditor;
using UnityEngine; using UnityEngine;
using Model; using Model;
using Object = Model.Object;
namespace MyEditor namespace MyEditor
{ {
...@@ -12,6 +11,7 @@ namespace MyEditor ...@@ -12,6 +11,7 @@ namespace MyEditor
{ {
static EditorInit() static EditorInit()
{ {
ObjectManager.Instance.Register("Editor", typeof(EditorInit).Assembly);
EditorApplication.update += Update; EditorApplication.update += Update;
} }
...@@ -24,12 +24,11 @@ namespace MyEditor ...@@ -24,12 +24,11 @@ namespace MyEditor
try try
{ {
Object.ObjectManager.Update(); ObjectManager.Instance.Update();
} }
catch (Exception e) catch (Exception e)
{ {
Object.ObjectManager.Dispose(); ObjectManager.Reset();
Object.ObjectManager = new ObjectManager();
Log.Error(e.ToString()); Log.Error(e.ToString());
} }
} }
......
...@@ -7,14 +7,13 @@ public class ObjectManagerToolsWindow : EditorWindow ...@@ -7,14 +7,13 @@ public class ObjectManagerToolsWindow : EditorWindow
[MenuItem("Tools/ObjectManagerTools/显示未Dispose的对象")] [MenuItem("Tools/ObjectManagerTools/显示未Dispose的对象")]
private static void ShowUnDisposeObjects() private static void ShowUnDisposeObjects()
{ {
Log.Info(Object.ObjectManager.ToString()); Log.Info(ObjectManager.Instance.ToString());
} }
[MenuItem("Tools/ObjectManagerTools/清除所有对象")] [MenuItem("Tools/ObjectManagerTools/清除所有对象")]
private static void ClearAllObjects() private static void ClearAllObjects()
{ {
Object.ObjectManager.Dispose(); ObjectManager.Reset();
Object.ObjectManager = new ObjectManager();
} }
} }
\ No newline at end of file
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using Base;
using Object = Model.Object;
namespace Model namespace Model
{ {
...@@ -12,7 +10,7 @@ namespace Model ...@@ -12,7 +10,7 @@ namespace Model
public void Load() public void Load()
{ {
Assembly assembly = Object.ObjectManager.GetAssembly("Base"); Assembly assembly = ObjectManager.Instance.GetAssembly("Base");
this.allConfig = new Dictionary<Type, ICategory>(); this.allConfig = new Dictionary<Type, ICategory>();
Type[] types = assembly.GetTypes(); Type[] types = assembly.GetTypes();
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using Base; using Base;
using Object = Model.Object;
namespace Model namespace Model
{ {
...@@ -30,7 +29,7 @@ namespace Model ...@@ -30,7 +29,7 @@ namespace Model
public void Load() public void Load()
{ {
this.allEvents = new Dictionary<EventIdType, List<object>>(); this.allEvents = new Dictionary<EventIdType, List<object>>();
Assembly[] assemblies = Object.ObjectManager.GetAssemblies(); Assembly[] assemblies = ObjectManager.Instance.GetAssemblies();
foreach (Assembly assembly in assemblies) foreach (Assembly assembly in assemblies)
{ {
Type[] types = assembly.GetTypes(); Type[] types = assembly.GetTypes();
......
...@@ -40,7 +40,7 @@ namespace Model ...@@ -40,7 +40,7 @@ namespace Model
this.handlers = new Dictionary<ushort, List<IMHandler>>(); this.handlers = new Dictionary<ushort, List<IMHandler>>();
this.messageOpcode = new Dictionary<Type, MessageAttribute>(); this.messageOpcode = new Dictionary<Type, MessageAttribute>();
Assembly[] assemblies = Object.ObjectManager.GetAssemblies(); Assembly[] assemblies = ObjectManager.Instance.GetAssemblies();
foreach (Assembly assembly in assemblies) foreach (Assembly assembly in assemblies)
{ {
......
...@@ -8,8 +8,8 @@ namespace Model ...@@ -8,8 +8,8 @@ namespace Model
{ {
private void Start() private void Start()
{ {
Object.ObjectManager.Register("Model", typeof(Game).Assembly); ObjectManager.Instance.Register("Model", typeof(Game).Assembly);
Object.ObjectManager.Register("Controller", DllHelper.GetController()); ObjectManager.Instance.Register("Controller", DllHelper.GetController());
Game.Scene.AddComponent<EventComponent>().Run(EventIdType.InitSceneStart); Game.Scene.AddComponent<EventComponent>().Run(EventIdType.InitSceneStart);
} }
...@@ -18,7 +18,7 @@ namespace Model ...@@ -18,7 +18,7 @@ namespace Model
{ {
try try
{ {
Object.ObjectManager.Update(); ObjectManager.Instance.Update();
} }
catch (Exception e) catch (Exception e)
{ {
......
...@@ -2,9 +2,6 @@ ...@@ -2,9 +2,6 @@
namespace Model namespace Model
{ {
/// <summary>
/// Component的Id与Owner Entity Id一样
/// </summary>
[BsonKnownTypes(typeof(AConfigComponent))] [BsonKnownTypes(typeof(AConfigComponent))]
public abstract class Component : Object public abstract class Component : Object
{ {
......
...@@ -66,7 +66,7 @@ namespace Model ...@@ -66,7 +66,7 @@ namespace Model
this.components.Add(component); this.components.Add(component);
this.componentDict.Add(component.GetType(), component); this.componentDict.Add(component.GetType(), component);
ObjectManager.Awake(component.Id); ObjectManager.Instance.Awake(component);
return component; return component;
} }
...@@ -87,7 +87,7 @@ namespace Model ...@@ -87,7 +87,7 @@ namespace Model
this.components.Add(component); this.components.Add(component);
this.componentDict.Add(component.GetType(), component); this.componentDict.Add(component.GetType(), component);
ObjectManager.Awake(component.Id, p1); ObjectManager.Instance.Awake(component, p1);
return component; return component;
} }
...@@ -108,7 +108,7 @@ namespace Model ...@@ -108,7 +108,7 @@ namespace Model
this.components.Add(component); this.components.Add(component);
this.componentDict.Add(component.GetType(), component); this.componentDict.Add(component.GetType(), component);
ObjectManager.Awake(component.Id, p1, p2); ObjectManager.Instance.Awake(component, p1, p2);
return component; return component;
} }
...@@ -130,7 +130,7 @@ namespace Model ...@@ -130,7 +130,7 @@ namespace Model
this.components.Add(component); this.components.Add(component);
this.componentDict.Add(component.GetType(), component); this.componentDict.Add(component.GetType(), component);
ObjectManager.Awake(component.Id, p1, p2, p3); ObjectManager.Instance.Awake(component, p1, p2, p3);
return component; return component;
} }
...@@ -147,7 +147,7 @@ namespace Model ...@@ -147,7 +147,7 @@ namespace Model
} }
this.components.Add(component); this.components.Add(component);
this.componentDict.Add(component.GetType(), component); this.componentDict.Add(component.GetType(), component);
ObjectManager.Awake(component.Id); ObjectManager.Instance.Awake(component);
} }
public void RemoveComponent<K>() where K : Component public void RemoveComponent<K>() where K : Component
......
namespace Model
{
/// <summary>
/// World的Componet实现该接口后,会在World.Start时调用该Start方法
/// </summary>
public interface IStart
{
void Start();
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: ee0b99021f2abfb408ca33f2f551a1d8
timeCreated: 1474942922
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
...@@ -7,22 +7,19 @@ namespace Model ...@@ -7,22 +7,19 @@ namespace Model
{ {
public abstract class Object: IDisposable, ISupportInitialize public abstract class Object: IDisposable, ISupportInitialize
{ {
[BsonIgnore]
public static ObjectManager ObjectManager = new ObjectManager();
[BsonId] [BsonId]
public long Id { get; private set; } public long Id { get; private set; }
protected Object() protected Object()
{ {
Id = IdGenerater.GenerateId(); Id = IdGenerater.GenerateId();
ObjectManager.Add(this); ObjectManager.Instance.Add(this);
} }
protected Object(long id) protected Object(long id)
{ {
this.Id = id; this.Id = id;
ObjectManager.Add(this); ObjectManager.Instance.Add(this);
} }
public virtual void Dispose() public virtual void Dispose()
...@@ -32,7 +29,7 @@ namespace Model ...@@ -32,7 +29,7 @@ namespace Model
return; return;
} }
ObjectManager.Remove(this.Id); ObjectManager.Instance.Remove(this);
this.Id = 0; this.Id = 0;
} }
......
...@@ -39,19 +39,33 @@ namespace Model ...@@ -39,19 +39,33 @@ namespace Model
private Dictionary<Type, IObjectEvent> objectEvents; private Dictionary<Type, IObjectEvent> objectEvents;
private readonly Dictionary<long, Object> objects = new Dictionary<long, Object>(); private readonly HashSet<Object> objects = new HashSet<Object>();
private readonly HashSet<Object> updates = new HashSet<Object>();
private readonly HashSet<Object> loaders = new HashSet<Object>();
private List<long> starts = new List<long>(); private static ObjectManager instance = new ObjectManager();
private List<long> newStarts = new List<long>();
private List<long> updates = new List<long>(3000); public static ObjectManager Instance
private List<long> newUpdates = new List<long>(3000); {
get
{
return instance;
}
}
private readonly List<long> loaders = new List<long>(); private ObjectManager()
{
}
public static void Reset()
{
instance.Dispose();
instance = new ObjectManager();
}
public void Dispose() public void Dispose()
{ {
foreach (Object o in this.objects.Values.ToArray()) foreach (Object o in this.objects.ToArray())
{ {
o.Dispose(); o.Dispose();
} }
...@@ -99,13 +113,8 @@ namespace Model ...@@ -99,13 +113,8 @@ namespace Model
private void Load() private void Load()
{ {
foreach (long id in this.loaders) foreach (Object obj in this.loaders)
{ {
Object obj;
if (!this.objects.TryGetValue(id, out obj))
{
continue;
}
IObjectEvent objectEvent; IObjectEvent objectEvent;
if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent)) if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
{ {
...@@ -128,44 +137,51 @@ namespace Model ...@@ -128,44 +137,51 @@ namespace Model
return; return;
} }
this.objects.Add(obj.Id, obj); this.objects.Add(obj);
IObjectEvent objectEvent; IObjectEvent objectEvent;
if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent)) if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
{ {
return; return;
} }
IStart iStart = objectEvent as IStart;
if (iStart != null)
{
this.newStarts.Add(obj.Id);
}
IUpdate iUpdate = objectEvent as IUpdate; IUpdate iUpdate = objectEvent as IUpdate;
if (iUpdate != null) if (iUpdate != null)
{ {
this.newUpdates.Add(obj.Id); this.updates.Add(obj);
} }
ILoader iLoader = objectEvent as ILoader; ILoader iLoader = objectEvent as ILoader;
if (iLoader != null) if (iLoader != null)
{ {
this.loaders.Add(obj.Id); this.loaders.Add(obj);
} }
} }
public void Remove(long id) public void Remove(Object obj)
{ {
this.objects.Remove(id); this.objects.Remove(obj);
}
public void Awake(long id) IObjectEvent objectEvent;
{ if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
Object obj;
if (!objects.TryGetValue(id, out obj))
{ {
return; return;
} }
IUpdate iUpdate = objectEvent as IUpdate;
if (iUpdate != null)
{
this.updates.Remove(obj);
}
ILoader iLoader = objectEvent as ILoader;
if (iLoader != null)
{
this.loaders.Remove(obj);
}
}
public void Awake(Object obj)
{
IObjectEvent objectEvent; IObjectEvent objectEvent;
if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent)) if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
{ {
...@@ -180,13 +196,8 @@ namespace Model ...@@ -180,13 +196,8 @@ namespace Model
iAwake.Awake(); iAwake.Awake();
} }
public void Awake<P1>(long id, P1 p1) public void Awake<P1>(Object obj, P1 p1)
{ {
Object obj;
if (!objects.TryGetValue(id, out obj))
{
return;
}
IObjectEvent objectEvent; IObjectEvent objectEvent;
if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent)) if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
{ {
...@@ -201,13 +212,8 @@ namespace Model ...@@ -201,13 +212,8 @@ namespace Model
iAwake.Awake(p1); iAwake.Awake(p1);
} }
public void Awake<P1, P2>(long id, P1 p1, P2 p2) public void Awake<P1, P2>(Object obj, P1 p1, P2 p2)
{ {
Object obj;
if (!objects.TryGetValue(id, out obj))
{
return;
}
IObjectEvent objectEvent; IObjectEvent objectEvent;
if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent)) if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
{ {
...@@ -222,13 +228,8 @@ namespace Model ...@@ -222,13 +228,8 @@ namespace Model
iAwake.Awake(p1, p2); iAwake.Awake(p1, p2);
} }
public void Awake<P1, P2, P3>(long id, P1 p1, P2 p2, P3 p3) public void Awake<P1, P2, P3>(Object obj, P1 p1, P2 p2, P3 p3)
{ {
Object obj;
if (!objects.TryGetValue(id, out obj))
{
return;
}
IObjectEvent objectEvent; IObjectEvent objectEvent;
if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent)) if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
{ {
...@@ -242,49 +243,11 @@ namespace Model ...@@ -242,49 +243,11 @@ namespace Model
objectEvent.SetValue(obj); objectEvent.SetValue(obj);
iAwake.Awake(p1, p2, p3); iAwake.Awake(p1, p2, p3);
} }
private void Start()
{
starts = newStarts;
newStarts = new List<long>();
foreach (long id in starts)
{
Object obj;
if (!this.objects.TryGetValue(id, out obj))
{
continue;
}
IObjectEvent objectEvent;
if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
{
continue;
}
IStart iStart = objectEvent as IStart;
if (iStart == null)
{
continue;
}
objectEvent.SetValue(obj);
iStart.Start();
}
}
public void Update() public void Update()
{ {
this.Start(); foreach (Object obj in updates)
// 交换update
List<long> tmpUpdate = updates;
updates = newUpdates;
newUpdates = tmpUpdate;
newUpdates.Clear();
foreach (long id in updates)
{ {
Object obj;
if (!objects.TryGetValue(id, out obj))
{
continue;
}
IObjectEvent objectEvent; IObjectEvent objectEvent;
if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent)) if (!objectEvents.TryGetValue(obj.GetType(), out objectEvent))
{ {
...@@ -295,7 +258,6 @@ namespace Model ...@@ -295,7 +258,6 @@ namespace Model
{ {
continue; continue;
} }
newUpdates.Add(id);
objectEvent.SetValue(obj); objectEvent.SetValue(obj);
try try
{ {
...@@ -311,7 +273,7 @@ namespace Model ...@@ -311,7 +273,7 @@ namespace Model
public override string ToString() public override string ToString()
{ {
var info = new Dictionary<string, int>(); var info = new Dictionary<string, int>();
foreach (Object obj in objects.Values) foreach (Object obj in objects)
{ {
if (info.ContainsKey(obj.GetType().Name)) if (info.ContainsKey(obj.GetType().Name))
{ {
...@@ -330,7 +292,7 @@ namespace Model ...@@ -330,7 +292,7 @@ namespace Model
sb.Append($"{info[key],10} {key}\r\n"); sb.Append($"{info[key],10} {key}\r\n");
} }
sb.Append($"\r\n start: {newStarts.Count}, update: {newUpdates.Count} total: {this.objects.Count}"); sb.Append($"\r\n update: {this.updates.Count} total: {this.objects.Count}");
return sb.ToString(); return sb.ToString();
} }
} }
......
...@@ -130,7 +130,6 @@ ...@@ -130,7 +130,6 @@
<Compile Include="Assets\Scripts\Object\Entity.cs" /> <Compile Include="Assets\Scripts\Object\Entity.cs" />
<Compile Include="Assets\Scripts\Object\IAwake.cs" /> <Compile Include="Assets\Scripts\Object\IAwake.cs" />
<Compile Include="Assets\Scripts\Object\ILoader.cs" /> <Compile Include="Assets\Scripts\Object\ILoader.cs" />
<Compile Include="Assets\Scripts\Object\IStart.cs" />
<Compile Include="Assets\Scripts\Object\IUpdate.cs" /> <Compile Include="Assets\Scripts\Object\IUpdate.cs" />
<Compile Include="Assets\Scripts\Object\Object.cs" /> <Compile Include="Assets\Scripts\Object\Object.cs" />
<Compile Include="Assets\Scripts\Object\ObjectEventAttribute.cs" /> <Compile Include="Assets\Scripts\Object\ObjectEventAttribute.cs" />
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册