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

Singleton中把自旋锁改成lock,临界区很小的情况下,lock性能没什么问题

tanghai 2 лет назад
Родитель
Сommit
72d158063f

+ 1 - 8
Unity/Assets/Scripts/Core/Network/NetServices.cs

@@ -17,15 +17,8 @@ namespace ET
         
         private long idGenerator;
 
-        public override void Dispose()
+        public override void Destroy()
         {
-            if (this.IsDisposed())
-            {
-                return;
-            }
-            
-            base.Dispose();
-            
             foreach (var kv in this.services)
             {
                 kv.Value.Dispose();

+ 7 - 0
Unity/Assets/Scripts/Core/World/ISingletonDestroy.cs

@@ -0,0 +1,7 @@
+namespace ET
+{
+    public interface ISingletonDestroy
+    {
+        void Destroy();
+    }
+}

+ 11 - 0
Unity/Assets/Scripts/Core/World/ISingletonDestroy.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 05613b4e63ae5a14887a34e97a0c1a0f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 3
Unity/Assets/Scripts/Core/World/Module/Scheduler/ThreadPoolScheduler.cs

@@ -69,10 +69,8 @@ namespace ET
                 }
             }
 
-            public override void Dispose()
+            public override void Destroy()
             {
-                base.Dispose();
-                
                 this.isStart = false;
                 foreach (Thread thread in this.threads)
                 {

+ 1 - 3
Unity/Assets/Scripts/Core/World/Module/Scheduler/ThreadScheduler.cs

@@ -43,10 +43,8 @@ namespace ET
                 }
             }
 
-            public override void Dispose()
+            public override void Destroy()
             {
-                base.Dispose();
-                
                 this.isStart = false;
                 foreach (var kv in this.dictionary)
                 {

+ 19 - 52
Unity/Assets/Scripts/Core/World/Singleton.cs

@@ -6,53 +6,33 @@ namespace ET
     public interface ISingleton: IDisposable
     {
         void Register();
-        bool IsDisposed();
     }
     
     public abstract class Singleton<T>: ISingleton where T: Singleton<T>, new()
     {
         private bool isDisposed;
-
-        [StaticField]
-        private static SpinLock spinLock;
         
         [StaticField]
         private static T instance;
+        
+        [StaticField]
+        private static readonly object lockObj = new();
 
-        // 自旋锁保证线程安全
         public static T Instance
         {
             get
             {
-                bool lockTaken = false;
-                try
-                {
-                    spinLock.Enter(ref lockTaken);
-                    return instance;
-                }
-                finally
+                lock (lockObj)
                 {
-                    if (lockTaken)
-                    {
-                        spinLock.Exit();
-                    }
+                    return instance; 
                 }
             }
             set
             {
-                bool lockTaken = false;
-                try
+                lock (lockObj)
                 {
-                    spinLock.Enter(ref lockTaken);
                     instance = value;
                 }
-                finally
-                {
-                    if (lockTaken)
-                    {
-                        spinLock.Exit();
-                    }
-                }
             }
         }
 
@@ -61,48 +41,35 @@ namespace ET
             Instance = (T)this;
         }
 
-        public virtual bool IsDisposed()
+        public bool IsDisposed()
         {
-            bool lockTaken = false;
-            try
+            lock (lockObj)
             {
-                spinLock.Enter(ref lockTaken);
-                
                 return this.isDisposed;
             }
-            finally
-            {
-                if (lockTaken)
-                {
-                    spinLock.Exit();
-                }
-            }
         }
 
-        public virtual void Dispose()
+        public virtual void Destroy()
+        {
+            
+        }
+
+        void IDisposable.Dispose()
         {
-            bool lockTaken = false;
-            try
+            T t;
+            lock (lockObj)
             {
-                spinLock.Enter(ref lockTaken);
-                
                 if (this.isDisposed)
                 {
                     return;
                 }
                 this.isDisposed = true;
                 
-                T t = instance;
+                t = instance;
                 instance = null;
-                t.Dispose();
-            }
-            finally
-            {
-                if (lockTaken)
-                {
-                    spinLock.Exit();
-                }
             }
+            
+            t.Destroy();
         }
     }
 }

+ 3 - 1
Unity/Assets/Scripts/Hotfix/Server/Module/ActorLocation/ActorLocationSenderComponentSystem.cs

@@ -81,7 +81,9 @@ namespace ET.Server
             return (ActorLocationSender) actorLocationSender;
         }
 
-        private static void Remove(this ActorLocationSenderOneType self, long id)
+        // 有需要主动删除actorMessageSender的需求,比如断线重连,玩家登录了不同的Gate,这时候需要通知map删掉之前的actorMessageSender
+        // 然后重新创建新的,重新请求新的ActorId
+        public static void Remove(this ActorLocationSenderOneType self, long id)
         {
             if (!self.Children.TryGetValue(id, out Entity actorMessageSender))
             {