Просмотр исходного кода

1.增加Start方法,Start在对象Update之前调用一次
2.Entity与Component全部由ObjectFactory进行创建,便于做对象池

tanghai 8 лет назад
Родитель
Сommit
3abac972bb

+ 4 - 4
Server/Hotfix/Component/RealmGateAddressComponentE.cs

@@ -3,17 +3,17 @@
 namespace Hotfix
 {
 	[ObjectEvent]
-	public class RealmGateAddressComponentEvent : ObjectEvent<RealmGateAddressComponent>, IAwake
+	public class RealmGateAddressComponentEvent : ObjectEvent<RealmGateAddressComponent>, IStart
 	{
-		public void Awake()
+		public void Start()
 		{
-			this.Get().Awake();
+			this.Get().Start();
 		}
 	}
 	
 	public static class RealmGateAddressComponentE
 	{
-		public static void Awake(this RealmGateAddressComponent component)
+		public static void Start(this RealmGateAddressComponent component)
 		{
 			StartConfig[] startConfigs = component.GetComponent<StartConfigComponent>().GetAll();
 			foreach (StartConfig config in startConfigs)

+ 1 - 0
Server/Hotfix/Message/C2R_LoginHandler.cs

@@ -8,6 +8,7 @@ namespace Hotfix
 	{
 		protected override async void Run(Session session, C2R_Login message, Action<R2C_Login> reply)
 		{
+			Log.Debug("11111111111111111111");
 			R2C_Login response = new R2C_Login();
 			try
 			{

+ 63 - 0
Server/Model/Helper/ObjectFactory.cs

@@ -0,0 +1,63 @@
+using System;
+
+namespace Model
+{
+	public static class ObjectFactory
+	{
+		public static T Create<T>() where T : Disposer
+		{
+			T disposer = (T)Activator.CreateInstance(typeof(T));
+			ObjectEvents.Instance.Awake(disposer);
+			return disposer;
+		}
+
+		public static T Create<T, A>(A a) where T : Disposer
+		{
+			T disposer = (T)Activator.CreateInstance(typeof(T));
+			ObjectEvents.Instance.Awake(disposer, a);
+			return disposer;
+		}
+
+		public static T Create<T, A, B>(A a, B b) where T : Disposer
+		{
+			T disposer = (T)Activator.CreateInstance(typeof(T));
+			ObjectEvents.Instance.Awake(disposer, a, b);
+			return disposer;
+		}
+
+		public static T Create<T, A, B, C>(A a, B b, C c) where T : Disposer
+		{
+			T disposer = (T)Activator.CreateInstance(typeof(T));
+			ObjectEvents.Instance.Awake(disposer, a, b, c);
+			return disposer;
+		}
+
+		public static T CreateWithId<T>(long id) where T : Disposer
+		{
+			T disposer = (T)Activator.CreateInstance(typeof(T), id);
+			ObjectEvents.Instance.Awake(disposer);
+			return disposer;
+		}
+
+		public static T CreateWithId<T, A>(long id, A a) where T : Disposer
+		{
+			T disposer = (T)Activator.CreateInstance(typeof(T), id);
+			ObjectEvents.Instance.Awake(disposer, a);
+			return disposer;
+		}
+
+		public static T CreateWithId<T, A, B>(long id, A a, B b) where T : Disposer
+		{
+			T disposer = (T)Activator.CreateInstance(typeof(T), id);
+			ObjectEvents.Instance.Awake(disposer, a, b);
+			return disposer;
+		}
+
+		public static T CreateWithId<T, A, B, C>(long id, A a, B b, C c) where T : Disposer
+		{
+			T disposer = (T)Activator.CreateInstance(typeof(T), id);
+			ObjectEvents.Instance.Awake(disposer, a, b, c);
+			return disposer;
+		}
+	}
+}

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

@@ -15,12 +15,10 @@ namespace Model
 
 		protected Component()
 		{
-			ObjectEvents.Instance.Add(this);
 		}
 
 		protected Component(long id): base(id)
 		{
-			ObjectEvents.Instance.Add(this);
 		}
 
 		public T GetComponent<T>() where T : Component

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

@@ -6,10 +6,12 @@ namespace Model
 	{
 		protected Disposer(): base(IdGenerater.GenerateId())
 		{
+			ObjectEvents.Instance.Add(this);
 		}
 
 		protected Disposer(long id): base(id)
 		{
+			ObjectEvents.Instance.Add(this);
 		}
 
 		public virtual void Dispose()

+ 4 - 29
Server/Model/Object/Entity.cs

@@ -21,12 +21,10 @@ namespace Model
 
 		protected Entity()
 		{
-			ObjectEvents.Instance.Add(this);
 		}
 
 		protected Entity(long id): base(id)
 		{
-			ObjectEvents.Instance.Add(this);
 		}
 
 		public override void Dispose()
@@ -53,7 +51,7 @@ namespace Model
 
 		public K AddComponent<K>() where K : Component, new()
 		{
-			K component = (K) Activator.CreateInstance(typeof (K));
+			K component = ObjectFactory.Create<K>();
 			component.Owner = this;
 
 			if (this.componentDict.ContainsKey(component.GetType()))
@@ -71,13 +69,12 @@ namespace Model
 				this.components.Add(component);
 			}
 			this.componentDict.Add(component.GetType(), component);
-			ObjectEvents.Instance.Awake(component);
 			return component;
 		}
 
 		public K AddComponent<K, P1>(P1 p1) where K : Component, new()
 		{
-			K component = (K) Activator.CreateInstance(typeof (K));
+			K component = ObjectFactory.Create<K, P1>(p1);
 			component.Owner = this;
 
 			if (this.componentDict.ContainsKey(component.GetType()))
@@ -95,13 +92,12 @@ namespace Model
 				this.components.Add(component);
 			}
 			this.componentDict.Add(component.GetType(), component);
-			ObjectEvents.Instance.Awake(component, p1);
 			return component;
 		}
 
 		public K AddComponent<K, P1, P2>(P1 p1, P2 p2) where K : Component, new()
 		{
-			K component = (K) Activator.CreateInstance(typeof (K));
+			K component = ObjectFactory.Create<K, P1, P2>(p1, p2);
 			component.Owner = this;
 
 			if (this.componentDict.ContainsKey(component.GetType()))
@@ -119,13 +115,12 @@ namespace Model
 				this.components.Add(component);
 			}
 			this.componentDict.Add(component.GetType(), component);
-			ObjectEvents.Instance.Awake(component, p1, p2);
 			return component;
 		}
 
 		public K AddComponent<K, P1, P2, P3>(P1 p1, P2 p2, P3 p3) where K : Component, new()
 		{
-			K component = (K) Activator.CreateInstance(typeof (K));
+			K component = ObjectFactory.Create<K, P1, P2, P3>(p1, p2, p3);
 			component.Owner = this;
 
 			if (this.componentDict.ContainsKey(component.GetType()))
@@ -143,29 +138,9 @@ namespace Model
 				this.components.Add(component);
 			}
 			this.componentDict.Add(component.GetType(), component);
-			ObjectEvents.Instance.Awake(component, p1, p2, p3);
 			return component;
 		}
 
-		public void AddComponent(Component component)
-		{
-			if (this.componentDict.ContainsKey(component.GetType()))
-			{
-				throw new Exception($"AddComponent, component already exist, id: {this.Id}, component: {component.GetType().Name}");
-			}
-
-			if (this.components == null)
-			{
-				this.components = new HashSet<Component>();
-			}
-			if (component is ComponentDB)
-			{
-				this.components.Add(component);
-			}
-			this.componentDict.Add(component.GetType(), component);
-			ObjectEvents.Instance.Awake(component);
-		}
-
 		public void RemoveComponent<K>() where K : Component
 		{
 			if (!this.componentDict.TryGetValue(typeof(K), out Component component))

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

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

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

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

+ 20 - 35
Server/Model/Object/ObjectEvents.cs

@@ -50,8 +50,7 @@ namespace Model
 		private Queue<Disposer> updates = new Queue<Disposer>();
 		private Queue<Disposer> updates2 = new Queue<Disposer>();
 
-		private Queue<Disposer> lateUpdates = new Queue<Disposer>();
-		private Queue<Disposer> lateUpdates2 = new Queue<Disposer>();
+		private Queue<Disposer> starts = new Queue<Disposer>();
 
 		private Queue<Disposer> loaders = new Queue<Disposer>();
 		private Queue<Disposer> loaders2 = new Queue<Disposer>();
@@ -114,9 +113,9 @@ namespace Model
 				this.updates.Enqueue(disposer);
 			}
 
-			if (objectEvent is ILateUpdate)
+			if (objectEvent is IStart)
 			{
-				this.lateUpdates.Enqueue(disposer);
+				this.starts.Enqueue(disposer);
 			}
 		}
 
@@ -216,46 +215,32 @@ namespace Model
 			ObjectHelper.Swap(ref this.loaders, ref this.loaders2);
 		}
 
-		public void Update()
+		private void Start()
 		{
-			while (this.updates.Count > 0)
+			while (this.starts.Count > 0)
 			{
-				Disposer disposer = this.updates.Dequeue();
-				if (disposer.Id == 0)
-				{
-					continue;
-				}
+				Disposer disposer = this.starts.Dequeue();
 				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectEvent objectEvent))
 				{
 					continue;
 				}
-
-				this.updates2.Enqueue(disposer);
-
-				IUpdate iUpdate = objectEvent as IUpdate;
-				if (iUpdate == null)
+				IStart iStart = objectEvent as IStart;
+				if (iStart == null)
 				{
 					continue;
 				}
 				objectEvent.Set(disposer);
-				try
-				{
-					iUpdate.Update();
-				}
-				catch (Exception e)
-				{
-					Log.Error(e.ToString());
-				}
+				iStart.Start();
 			}
-			
-			ObjectHelper.Swap(ref this.updates, ref this.updates2);
 		}
 
-		public void LateUpdate()
+		public void Update()
 		{
-			while (this.lateUpdates.Count > 0)
+			this.Start();
+
+			while (this.updates.Count > 0)
 			{
-				Disposer disposer = this.lateUpdates.Dequeue();
+				Disposer disposer = this.updates.Dequeue();
 				if (disposer.Id == 0)
 				{
 					continue;
@@ -265,25 +250,25 @@ namespace Model
 					continue;
 				}
 
-				this.lateUpdates2.Enqueue(disposer);
+				this.updates2.Enqueue(disposer);
 
-				ILateUpdate iLateUpdate = objectEvent as ILateUpdate;
-				if (iLateUpdate == null)
+				IUpdate iUpdate = objectEvent as IUpdate;
+				if (iUpdate == null)
 				{
 					continue;
 				}
 				objectEvent.Set(disposer);
 				try
 				{
-					iLateUpdate.LateUpdate();
+					iUpdate.Update();
 				}
 				catch (Exception e)
 				{
 					Log.Error(e.ToString());
 				}
 			}
-
-			ObjectHelper.Swap(ref this.lateUpdates, ref this.lateUpdates2);
+			
+			ObjectHelper.Swap(ref this.updates, ref this.updates2);
 		}
 	}
 }

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

@@ -71,6 +71,7 @@
     <Compile Include="Component\GamerComponent.cs" />
     <Compile Include="Entity\Gamer.cs" />
     <Compile Include="Entity\Location.cs" />
+    <Compile Include="Helper\ObjectFactory.cs" />
     <Compile Include="Message\IEntityActorHandler.cs" />
     <Compile Include="Component\OpcodeTypeComponent.cs" />
     <Compile Include="Component\ActorManagerComponent.cs" />
@@ -156,7 +157,7 @@
     <Compile Include="Object\Entity.cs" />
     <Compile Include="Object\IAwake.cs" />
     <Compile Include="Object\ILoad.cs" />
-    <Compile Include="Object\ILateUpdate.cs" />
+    <Compile Include="Object\IStart.cs" />
     <Compile Include="Object\IUpdate.cs" />
     <Compile Include="Object\ObjectEventAttribute.cs" />
     <Compile Include="Object\EntityType.cs" />

+ 4 - 1
Server/Server.sln

@@ -1,7 +1,7 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 15
-VisualStudioVersion = 15.0.26430.16
+VisualStudioVersion = 15.0.26730.10
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Server.Base", "Base\Server.Base.csproj", "{E5078EC6-2B0E-4711-BE8B-D99F69638316}"
 EndProject
@@ -91,4 +91,7 @@ Global
 	GlobalSection(NestedProjects) = preSolution
 		{C9992B7C-313E-4C9F-A954-640D01EDFB58} = {01CCAD69-09B1-42F9-8A39-489268BEE18D}
 	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {0B3370FF-162C-439D-9E8D-7DDFF59AD82B}
+	EndGlobalSection
 EndGlobal