Преглед на файлове

1.修复对象池一个大bug,导致每次new一个对象池,实际上对象池没作用。对象池起作用要注意在dispose中clear集合,reset变量,以防残留数据
2.vs终于修复了编译bug,现在hotfix工程可以直接引用工程了

tanghai преди 8 години
родител
ревизия
fac52247fa

+ 8 - 0
Server/Model/Base/Object/ObjectEvents.cs

@@ -121,6 +121,8 @@ namespace Model
 
 		public void Awake(Disposer disposer)
 		{
+			Instance.Add(disposer);
+
 			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectEvent objectEvent))
 			{
 				return;
@@ -136,6 +138,8 @@ namespace Model
 
 		public void Awake<P1>(Disposer disposer, P1 p1)
 		{
+			Instance.Add(disposer);
+
 			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectEvent objectEvent))
 			{
 				throw new Exception($"{disposer.GetType().Name} not found awake1");
@@ -151,6 +155,8 @@ namespace Model
 
 		public void Awake<P1, P2>(Disposer disposer, P1 p1, P2 p2)
 		{
+			Instance.Add(disposer);
+
 			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectEvent objectEvent))
 			{
 				throw new Exception($"{disposer.GetType().Name} not found awake2");
@@ -166,6 +172,8 @@ namespace Model
 
 		public void Awake<P1, P2, P3>(Disposer disposer, P1 p1, P2 p2, P3 p3)
 		{
+			Instance.Add(disposer);
+
 			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out IObjectEvent objectEvent))
 			{
 				throw new Exception($"{disposer.GetType().Name} not found awake3");

+ 15 - 14
Server/Model/Component/UnitComponent.cs

@@ -7,6 +7,21 @@ namespace Model
 	{
 		private readonly Dictionary<long, Unit> idUnits = new Dictionary<long, Unit>();
 
+		public override void Dispose()
+		{
+			if (this.Id == 0)
+			{
+				return;
+			}
+			base.Dispose();
+
+			foreach (Unit unit in this.idUnits.Values)
+			{
+				unit.Dispose();
+			}
+			this.idUnits.Clear();
+		}
+
 		public void Add(Unit unit)
 		{
 			this.idUnits.Add(unit.Id, unit);
@@ -43,19 +58,5 @@ namespace Model
 		{
 			return this.idUnits.Values.ToArray();
 		}
-
-		public override void Dispose()
-		{
-			if (this.Id == 0)
-			{
-				return;
-			}
-			base.Dispose();
-
-			foreach (Unit unit in this.idUnits.Values)
-			{
-				unit.Dispose();
-			}
-		}
 	}
 }

+ 0 - 2
Unity/Assets/Scripts/Base/Object/Disposer.cs

@@ -19,13 +19,11 @@ namespace Model
 		protected Disposer()
 		{
 			this.Id = IdGenerater.GenerateId();
-			ObjectEvents.Instance.Add(this);
 		}
 
 		protected Disposer(long id)
 		{
 			this.Id = id;
-			ObjectEvents.Instance.Add(this);
 		}
 
 		public virtual void Dispose()

+ 8 - 0
Unity/Assets/Scripts/Base/Object/ObjectEvents.cs

@@ -150,6 +150,8 @@ namespace Model
 
 		public void Awake(Disposer disposer)
 		{
+			ObjectEvents.Instance.Add(disposer);
+
 			IObjectEvent objectEvent;
 			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectEvent))
 			{
@@ -166,6 +168,8 @@ namespace Model
 
 		public void Awake<P1>(Disposer disposer, P1 p1)
 		{
+			ObjectEvents.Instance.Add(disposer);
+
 			IObjectEvent objectEvent;
 			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectEvent))
 			{
@@ -182,6 +186,8 @@ namespace Model
 
 		public void Awake<P1, P2>(Disposer disposer, P1 p1, P2 p2)
 		{
+			ObjectEvents.Instance.Add(disposer);
+
 			IObjectEvent objectEvent;
 			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectEvent))
 			{
@@ -198,6 +204,8 @@ namespace Model
 
 		public void Awake<P1, P2, P3>(Disposer disposer, P1 p1, P2 p2, P3 p3)
 		{
+			ObjectEvents.Instance.Add(disposer);
+
 			IObjectEvent objectEvent;
 			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectEvent))
 			{

+ 2 - 2
Unity/Assets/Scripts/Base/Object/ObjectPool.cs

@@ -11,7 +11,7 @@ namespace Model
 	    {
 		    get
 		    {
-			    return instance ?? new ObjectPool();
+			    return instance ?? (instance = new ObjectPool());
 		    }
 	    }
 
@@ -26,7 +26,7 @@ namespace Model
 		    instance = null;
 	    }
 
-        public Disposer Fetch(Type type)
+        private Disposer Fetch(Type type)
         {
 	        EQueue<Disposer> queue;
             if (!this.dictionary.TryGetValue(type, out queue))

+ 5 - 2
Unity/Assets/Scripts/Component/UIComponent.cs

@@ -25,7 +25,7 @@ namespace Model
 	public class UIComponent: Component
 	{
 		private GameObject Root;
-		private Dictionary<UIType, IUIFactory> UiTypes;
+		private readonly Dictionary<UIType, IUIFactory> UiTypes = new Dictionary<UIType, IUIFactory>();
 		private readonly Dictionary<UIType, UI> uis = new Dictionary<UIType, UI>();
 
 		public override void Dispose()
@@ -47,6 +47,9 @@ namespace Model
 				uis.Remove(type);
 				ui.Dispose();
 			}
+
+			this.uis.Clear();
+			this.UiTypes.Clear();
 		}
 
 		public void Awake()
@@ -57,7 +60,7 @@ namespace Model
 
 		public void Load()
 		{
-            UiTypes = new Dictionary<UIType, IUIFactory>();
+            this.UiTypes.Clear();
             
             Type[] types = DllHelper.GetMonoTypes();
 

+ 18 - 16
Unity/Assets/Scripts/Component/UnitComponent.cs

@@ -25,6 +25,24 @@ namespace Model
 			Instance = this;
 		}
 
+		public override void Dispose()
+		{
+			if (this.Id == 0)
+			{
+				return;
+			}
+			base.Dispose();
+
+			foreach (Unit unit in this.idUnits.Values)
+			{
+				unit.Dispose();
+			}
+
+			this.idUnits.Clear();
+
+			Instance = null;
+		}
+
 		public void Add(Unit unit)
 		{
 			this.idUnits.Add(unit.Id, unit);
@@ -62,21 +80,5 @@ namespace Model
 		{
 			return this.idUnits.Values.ToArray();
 		}
-
-		public override void Dispose()
-		{
-			if (this.Id == 0)
-			{
-				return;
-			}
-			base.Dispose();
-
-			foreach (Unit unit in this.idUnits.Values)
-			{
-				unit.Dispose();
-			}
-
-			Instance = null;
-		}
 	}
 }

+ 17 - 3
Unity/Hotfix/Base/Object/Disposer.cs

@@ -1,17 +1,31 @@
-namespace Hotfix
+using System;
+using Model;
+
+namespace Hotfix
 {
-	public abstract class Disposer : Object, IDisposable2
+	public abstract class Disposer : Object, IDisposable
 	{
 		public long Id { get; set; }
 
+		public bool IsFromPool { get; set; }
+
 		protected Disposer()
 		{
-			ObjectEvents.Instance.Add(this);
+			this.Id = IdGenerater.GenerateId();
+		}
+
+		protected Disposer(long id)
+		{
+			this.Id = id;
 		}
 
 		public virtual void Dispose()
 		{
 			this.Id = 0;
+			if (this.IsFromPool)
+			{
+				ObjectPool.Instance.Recycle(this);
+			}
 		}
 	}
 }

+ 8 - 2
Unity/Hotfix/Base/Object/ObjectEvents.cs

@@ -1,7 +1,5 @@
 using System;
 using System.Collections.Generic;
-using System.Linq;
-using System.Reflection;
 using Model;
 
 namespace Hotfix
@@ -111,6 +109,8 @@ namespace Hotfix
 
 		public void Awake(Disposer disposer)
 		{
+			ObjectEvents.Instance.Add(disposer);
+
 			IObjectEvent objectEvent;
 			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectEvent))
 			{
@@ -127,6 +127,8 @@ namespace Hotfix
 
 		public void Awake<P1>(Disposer disposer, P1 p1)
 		{
+			ObjectEvents.Instance.Add(disposer);
+
 			IObjectEvent objectEvent;
 			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectEvent))
 			{
@@ -143,6 +145,8 @@ namespace Hotfix
 
 		public void Awake<P1, P2>(Disposer disposer, P1 p1, P2 p2)
 		{
+			ObjectEvents.Instance.Add(disposer);
+
 			IObjectEvent objectEvent;
 			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectEvent))
 			{
@@ -159,6 +163,8 @@ namespace Hotfix
 
 		public void Awake<P1, P2, P3>(Disposer disposer, P1 p1, P2 p2, P3 p3)
 		{
+			ObjectEvents.Instance.Add(disposer);
+
 			IObjectEvent objectEvent;
 			if (!this.disposerEvents.TryGetValue(disposer.GetType(), out objectEvent))
 			{

+ 2 - 2
Unity/Hotfix/Base/Object/ObjectPool.cs

@@ -12,8 +12,8 @@ namespace Hotfix
 	    {
 		    get
 		    {
-			    return instance ?? new ObjectPool();
-		    }
+				return instance ?? (instance = new ObjectPool());
+			}
 	    }
 
         private readonly Dictionary<Type, EQueue<Disposer>> dictionary = new Dictionary<Type, EQueue<Disposer>>();

+ 10 - 8
Unity/Hotfix/Unity.Hotfix.csproj

@@ -35,14 +35,6 @@
     <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="Assembly-CSharp, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\Library\ScriptAssemblies\Assembly-CSharp.dll</HintPath>
-    </Reference>
-    <Reference Include="Assembly-CSharp-firstpass, Version=2.0.0.668, Culture=neutral, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\Library\ScriptAssemblies\Assembly-CSharp-firstpass.dll</HintPath>
-    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Threading, Version=1.0.2856.102, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
@@ -94,6 +86,16 @@
     <Folder Include="Event\" />
     <Folder Include="Handler\" />
   </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\Unity.csproj">
+      <Project>{cf118143-7e37-744f-be45-3f55345fec40}</Project>
+      <Name>Unity</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\Unity.Plugins.csproj">
+      <Project>{d1fdb199-0fb7-099d-3771-c6a942e4e326}</Project>
+      <Name>Unity.Plugins</Name>
+    </ProjectReference>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
     <PostBuildEvent>"$(ProjectDir)\..\Tools\pdb2mdb.exe" $(TargetFileName)</PostBuildEvent>