Jelajahi Sumber

简化了对象事件的实现方式

tanghai 8 tahun lalu
induk
melakukan
1818713d8a

+ 0 - 2
Server/Model/Object/Component.cs

@@ -38,8 +38,6 @@ namespace Model
 			base.Dispose();
 			base.Dispose();
 
 
 			this.Owner.RemoveComponent(this.GetType());
 			this.Owner.RemoveComponent(this.GetType());
-
-			ObjectEvents.Instance.Remove(this);
 		}
 		}
 
 
 		public override void EndInit()
 		public override void EndInit()

+ 0 - 2
Server/Model/Object/Entity.cs

@@ -55,8 +55,6 @@ namespace Model
 					Log.Error(e.ToString());
 					Log.Error(e.ToString());
 				}
 				}
 			}
 			}
-
-			ObjectEvents.Instance.Remove(this);
 		}
 		}
 
 
 		public K AddComponent<K>() where K : Component, new()
 		public K AddComponent<K>() where K : Component, new()

+ 7 - 0
Server/Model/Object/ILateUpdate.cs

@@ -0,0 +1,7 @@
+namespace Model
+{
+	public interface ILateUpdate
+	{
+		void LateUpdate();
+	}
+}

+ 100 - 72
Server/Model/Object/ObjectEvents.cs

@@ -48,12 +48,15 @@ namespace Model
 
 
 		private Dictionary<Type, IObjectEvent> disposerEvents;
 		private Dictionary<Type, IObjectEvent> disposerEvents;
 
 
-		private readonly HashSet<Disposer> updates = new HashSet<Disposer>();
-		private readonly HashSet<Disposer> loaders = new HashSet<Disposer>();
+		private Queue<Disposer> updates = new Queue<Disposer>();
+		private Queue<Disposer> updates2 = new Queue<Disposer>();
 
 
-		private readonly Queue<Disposer> adds = new Queue<Disposer>();
-		private readonly Queue<Disposer> removes = new Queue<Disposer>();
+		private Queue<Disposer> lateUpdates = new Queue<Disposer>();
+		private Queue<Disposer> lateUpdates2 = new Queue<Disposer>();
 
 
+		private Queue<Disposer> loaders = new Queue<Disposer>();
+		private Queue<Disposer> loaders2 = new Queue<Disposer>();
+		
 		public void Register(string name, Assembly assembly)
 		public void Register(string name, Assembly assembly)
 		{
 		{
 			this.assemblies[name] = assembly;
 			this.assemblies[name] = assembly;
@@ -95,79 +98,26 @@ namespace Model
 			return this.assemblies.Values.ToArray();
 			return this.assemblies.Values.ToArray();
 		}
 		}
 
 
-		private void Load()
+		public void Add(Disposer disposer)
 		{
 		{
-			foreach (Disposer disposer in this.loaders)
+			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectEvent objectEvent))
 			{
 			{
-				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectEvent objectEvent))
-				{
-					continue;
-				}
-				ILoad iLoader = objectEvent as ILoad;
-				if (iLoader == null)
-				{
-					continue;
-				}
-				objectEvent.Set(disposer);
-				iLoader.Load();
+				return;
 			}
 			}
-		}
-
-		public void Add(Disposer disposer)
-		{
-			this.adds.Enqueue(disposer);
-		}
 
 
-		public void Remove(Disposer disposer)
-		{
-			this.removes.Enqueue(disposer);
-		}
-
-		public void UpdateAdd()
-		{
-			while (this.adds.Count > 0)
+			if (objectEvent is ILoad)
 			{
 			{
-				Disposer disposer = this.adds.Dequeue();
-				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectEvent objectEvent))
-				{
-					continue;
-				}
-
-				IUpdate iUpdate = objectEvent as IUpdate;
-				if (iUpdate != null)
-				{
-					this.updates.Add(disposer);
-				}
-
-				ILoad iLoader = objectEvent as ILoad;
-				if (iLoader != null)
-				{
-					this.loaders.Add(disposer);
-				}
+				this.loaders.Enqueue(disposer);
 			}
 			}
-		}
 
 
-		public void UpdateRemove()
-		{
-			while (this.removes.Count > 0)
+			if (objectEvent is IUpdate)
 			{
 			{
-				Disposer disposer = this.removes.Dequeue();
-				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectEvent objectEvent))
-				{
-					continue;
-				}
-
-				IUpdate iUpdate = objectEvent as IUpdate;
-				if (iUpdate != null)
-				{
-					this.updates.Remove(disposer);
-				}
+				this.updates.Enqueue(disposer);
+			}
 
 
-				ILoad iLoader = objectEvent as ILoad;
-				if (iLoader != null)
-				{
-					this.loaders.Remove(disposer);
-				}
+			if (objectEvent is ILateUpdate)
+			{
+				this.lateUpdates.Enqueue(disposer);
 			}
 			}
 		}
 		}
 
 
@@ -231,17 +181,58 @@ namespace Model
 			iAwake.Awake(p1, p2, p3);
 			iAwake.Awake(p1, p2, p3);
 		}
 		}
 
 
-		public void Update()
+		public void Load()
 		{
 		{
-			this.UpdateAdd();
-			this.UpdateRemove();
+			while (this.loaders.Count > 0)
+			{
+				Disposer disposer = this.loaders.Dequeue();
+				if (disposer.Id == 0)
+				{
+					continue;
+				}
+
+				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectEvent objectEvent))
+				{
+					continue;
+				}
+
+				this.loaders2.Enqueue(disposer);
+
+				ILoad iLoad = objectEvent as ILoad;
+				if (iLoad == null)
+				{
+					continue;
+				}
+				objectEvent.Set(disposer);
+				try
+				{
+					iLoad.Load();
+				}
+				catch (Exception e)
+				{
+					Log.Error(e.ToString());
+				}
+			}
 
 
-			foreach (Disposer disposer in updates)
+			ObjectHelper.Swap(ref this.loaders, ref this.loaders2);
+		}
+
+		public void Update()
+		{
+			while (this.updates.Count > 0)
 			{
 			{
+				Disposer disposer = this.updates.Dequeue();
+				if (disposer.Id == 0)
+				{
+					continue;
+				}
 				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectEvent objectEvent))
 				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectEvent objectEvent))
 				{
 				{
 					continue;
 					continue;
 				}
 				}
+
+				this.updates2.Enqueue(disposer);
+
 				IUpdate iUpdate = objectEvent as IUpdate;
 				IUpdate iUpdate = objectEvent as IUpdate;
 				if (iUpdate == null)
 				if (iUpdate == null)
 				{
 				{
@@ -257,6 +248,43 @@ namespace Model
 					Log.Error(e.ToString());
 					Log.Error(e.ToString());
 				}
 				}
 			}
 			}
+			
+			ObjectHelper.Swap(ref this.updates, ref this.updates2);
+		}
+
+		public void LateUpdate()
+		{
+			while (this.lateUpdates.Count > 0)
+			{
+				Disposer disposer = this.lateUpdates.Dequeue();
+				if (disposer.Id == 0)
+				{
+					continue;
+				}
+				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectEvent objectEvent))
+				{
+					continue;
+				}
+
+				this.lateUpdates2.Enqueue(disposer);
+
+				ILateUpdate iLateUpdate = objectEvent as ILateUpdate;
+				if (iLateUpdate == null)
+				{
+					continue;
+				}
+				objectEvent.Set(disposer);
+				try
+				{
+					iLateUpdate.LateUpdate();
+				}
+				catch (Exception e)
+				{
+					Log.Error(e.ToString());
+				}
+			}
+
+			ObjectHelper.Swap(ref this.lateUpdates, ref this.lateUpdates2);
 		}
 		}
 	}
 	}
 }
 }

+ 1 - 0
Server/Model/Server.Model.csproj

@@ -100,6 +100,7 @@
     <Compile Include="Object\Entity.cs" />
     <Compile Include="Object\Entity.cs" />
     <Compile Include="Object\IAwake.cs" />
     <Compile Include="Object\IAwake.cs" />
     <Compile Include="Object\ILoad.cs" />
     <Compile Include="Object\ILoad.cs" />
+    <Compile Include="Object\ILateUpdate.cs" />
     <Compile Include="Object\IUpdate.cs" />
     <Compile Include="Object\IUpdate.cs" />
     <Compile Include="Object\ObjectEventAttribute.cs" />
     <Compile Include="Object\ObjectEventAttribute.cs" />
     <Compile Include="Object\EntityType.cs" />
     <Compile Include="Object\EntityType.cs" />