Преглед изворни кода

修复EventSystem一个问题:当同一帧里面,删除一类对象又创建这类对象,由于对象池的存在会导致其update方法跟lateupdate方法一帧调用多次,所以需要加上去重处理

tanghai пре 8 година
родитељ
комит
b98a871d8a

+ 23 - 1
Server/Model/Base/Object/EventSystem.cs

@@ -52,7 +52,9 @@ namespace Model
 
 		private Queue<Disposer> loaders = new Queue<Disposer>();
 		private Queue<Disposer> loaders2 = new Queue<Disposer>();
-		
+
+		private readonly HashSet<Disposer> unique = new HashSet<Disposer>();
+
 		public void Add(DLLType dllType, Assembly assembly)
 		{
 			this.assemblies[dllType] = assembly;
@@ -203,6 +205,7 @@ namespace Model
 
 		public void Load()
 		{
+			unique.Clear();
 			while (this.loaders.Count > 0)
 			{
 				Disposer disposer = this.loaders.Dequeue();
@@ -211,6 +214,11 @@ namespace Model
 					continue;
 				}
 
+				if (!this.unique.Add(disposer))
+				{
+					continue;
+				}
+
 				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectEvent objectEvent))
 				{
 					continue;
@@ -239,9 +247,16 @@ namespace Model
 
 		private void Start()
 		{
+			unique.Clear();
 			while (this.starts.Count > 0)
 			{
 				Disposer disposer = this.starts.Dequeue();
+
+				if (!this.unique.Add(disposer))
+				{
+					continue;
+				}
+
 				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectEvent objectEvent))
 				{
 					continue;
@@ -260,6 +275,7 @@ namespace Model
 		{
 			this.Start();
 
+			unique.Clear();
 			while (this.updates.Count > 0)
 			{
 				Disposer disposer = this.updates.Dequeue();
@@ -267,6 +283,12 @@ namespace Model
 				{
 					continue;
 				}
+
+				if (!this.unique.Add(disposer))
+				{
+					continue;
+				}
+
 				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectEvent objectEvent))
 				{
 					continue;

+ 29 - 1
Unity/Assets/Scripts/Base/Object/EventSystem.cs

@@ -62,7 +62,7 @@ namespace Model
 
 		private Queue<Disposer> updates = new Queue<Disposer>();
 		private Queue<Disposer> updates2 = new Queue<Disposer>();
-
+		
 		private readonly Queue<Disposer> starts = new Queue<Disposer>();
 
 		private Queue<Disposer> loaders = new Queue<Disposer>();
@@ -71,6 +71,10 @@ namespace Model
 		private Queue<Disposer> lateUpdates = new Queue<Disposer>();
 		private Queue<Disposer> lateUpdates2 = new Queue<Disposer>();
 
+		private readonly HashSet<Disposer> unique = new HashSet<Disposer>();
+
+
+
 		public void LoadHotfixDll()
 		{
 #if ILRuntime
@@ -264,6 +268,7 @@ namespace Model
 
 		public void Load()
 		{
+			unique.Clear();
 			while (this.loaders.Count > 0)
 			{
 				Disposer disposer = this.loaders.Dequeue();
@@ -272,6 +277,11 @@ namespace Model
 					continue;
 				}
 
+				if (!this.unique.Add(disposer))
+				{
+					continue;
+				}
+
 				IObjectSystem objectSystem;
 				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectSystem))
 				{
@@ -301,10 +311,16 @@ namespace Model
 
 		private void Start()
 		{
+			unique.Clear();
 			while (this.starts.Count > 0)
 			{
 				Disposer disposer = this.starts.Dequeue();
 
+				if (!this.unique.Add(disposer))
+				{
+					continue;
+				}
+
 				IObjectSystem objectSystem;
 				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectSystem))
 				{
@@ -324,6 +340,7 @@ namespace Model
 		{
 			this.Start();
 
+			this.unique.Clear();
 			while (this.updates.Count > 0)
 			{
 				Disposer disposer = this.updates.Dequeue();
@@ -332,6 +349,11 @@ namespace Model
 					continue;
 				}
 
+				if (!this.unique.Add(disposer))
+				{
+					continue;
+				}
+
 				IObjectSystem objectSystem;
 				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectSystem))
 				{
@@ -361,6 +383,7 @@ namespace Model
 
 		public void LateUpdate()
 		{
+			this.unique.Clear();
 			while (this.lateUpdates.Count > 0)
 			{
 				Disposer disposer = this.lateUpdates.Dequeue();
@@ -369,6 +392,11 @@ namespace Model
 					continue;
 				}
 
+				if (!this.unique.Add(disposer))
+				{
+					continue;
+				}
+
 				IObjectSystem objectSystem;
 				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectSystem))
 				{

+ 28 - 0
Unity/Hotfix/Base/Object/EventSystem.cs

@@ -45,6 +45,8 @@ namespace Hotfix
 		private Queue<Disposer> lateUpdates = new Queue<Disposer>();
 		private Queue<Disposer> lateUpdates2 = new Queue<Disposer>();
 
+		private readonly HashSet<Disposer> unique = new HashSet<Disposer>();
+
 		public EventSystem()
 		{
 			this.disposerEvents.Clear();
@@ -170,6 +172,7 @@ namespace Hotfix
 
 		public void Load()
 		{
+			unique.Clear();
 			while (this.loaders.Count > 0)
 			{
 				Disposer disposer = this.loaders.Dequeue();
@@ -178,6 +181,11 @@ namespace Hotfix
 					continue;
 				}
 
+				if (!this.unique.Add(disposer))
+				{
+					continue;
+				}
+
 				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectSystem objectEvent))
 				{
 					continue;
@@ -206,9 +214,16 @@ namespace Hotfix
 
 		private void Start()
 		{
+			unique.Clear();
 			while (this.starts.Count > 0)
 			{
 				Disposer disposer = this.starts.Dequeue();
+
+				if (!this.unique.Add(disposer))
+				{
+					continue;
+				}
+
 				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectSystem objectEvent))
 				{
 					continue;
@@ -227,6 +242,7 @@ namespace Hotfix
 		{
 			this.Start();
 
+			unique.Clear();
 			while (this.updates.Count > 0)
 			{
 				Disposer disposer = this.updates.Dequeue();
@@ -234,6 +250,12 @@ namespace Hotfix
 				{
 					continue;
 				}
+
+				if (!this.unique.Add(disposer))
+				{
+					continue;
+				}
+
 				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectSystem objectEvent))
 				{
 					continue;
@@ -262,6 +284,7 @@ namespace Hotfix
 
 		public void LateUpdate()
 		{
+			unique.Clear();
 			while (this.lateUpdates.Count > 0)
 			{
 				Disposer disposer = this.lateUpdates.Dequeue();
@@ -270,6 +293,11 @@ namespace Hotfix
 					continue;
 				}
 
+				if (!this.unique.Add(disposer))
+				{
+					continue;
+				}
+
 				IObjectSystem objectSystem;
 				if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectSystem))
 				{