tanghai 2 anni fa
parent
commit
e29d9e61eb

+ 5 - 3
DotNet/App/Program.cs

@@ -15,15 +15,17 @@ namespace ET
             //客户端服务端不热更不共享的组件可以写到Loader中,比如表现层需要一个组件不需要热更,可以写在Loader中,这样性能更高。如果客户端跟服务端共享的并且不需要热更的
             //的组件可以写在Core中
             Entry.Init();
-            Init.Start();
+            
+            Init init = new();
+            init.Start();
             
             while (true)
             {
                 Thread.Sleep(1);
                 try
                 {
-                    FiberManager.Instance.Update();
-                    FiberManager.Instance.LateUpdate();
+                    init.Update();
+                    init.LateUpdate();
                 }
                 catch (Exception e)
                 {

+ 18 - 4
DotNet/Loader/Init.cs

@@ -1,16 +1,19 @@
 using System;
-using System.Collections.Generic;
+using System.Threading;
 using CommandLine;
-using MemoryPack;
 
 namespace ET
 {
-	public static class Init
+	public class Init
 	{
-		public static void Start()
+		private readonly ThreadSynchronizationContext threadSynchronizationContext = new();
+		
+		public void Start()
 		{
 			try
 			{	
+				SynchronizationContext.SetSynchronizationContext(threadSynchronizationContext);
+				
 				AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
 				{
 					Log.Error(e.ExceptionObject.ToString());
@@ -29,5 +32,16 @@ namespace ET
 				Log.Error(e);
 			}
 		}
+
+		public void Update()
+		{
+			this.threadSynchronizationContext.Update();
+			FiberManager.Instance.Update();
+		}
+
+		public void LateUpdate()
+		{
+			FiberManager.Instance.LateUpdate();
+		}
 	}
 }

+ 1 - 1
Unity/Assets/Scripts/Core/Fiber/Fiber.cs

@@ -54,7 +54,7 @@ namespace ET
         public void Update()
         {
             this.IsRuning = true;
-            
+            //this.FiberTaskScheduler.Update();
             this.TimeInfo.Update();
             this.EntitySystem.Update();
         }

+ 40 - 0
Unity/Assets/Scripts/Core/Fiber/Module/Synchronization/FiberTaskScheduler.cs

@@ -0,0 +1,40 @@
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace ET
+{
+    public class FiberTaskScheduler: TaskScheduler
+    {
+        private readonly ConcurrentQueue<Task> queue = new();
+
+        public void Update()
+        {
+            while (true)
+            {
+                if (!this.queue.TryDequeue(out Task task))
+                {
+                    return;
+                }
+
+                base.TryExecuteTask(task);
+            }
+        }
+
+        protected override IEnumerable<Task> GetScheduledTasks()
+        {
+            return this.queue;
+        }
+
+        protected override void QueueTask(Task task)
+        {
+            queue.Enqueue(task);
+        }
+
+        protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
+        {
+            queue.Enqueue(task);
+            return true;
+        }
+    }
+}

+ 1 - 1
Unity/Assets/Scripts/Core/Fiber/Module/Synchronization/MainThreadSynchronizationContext.cs.meta → Unity/Assets/Scripts/Core/Fiber/Module/Synchronization/FiberTaskScheduler.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 12b0943060ea1bf40b78d547d4dd80bc
+guid: 54538c8374bfae744a9a242c227e48ad
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 0 - 31
Unity/Assets/Scripts/Core/Fiber/Module/Synchronization/MainThreadSynchronizationContext.cs

@@ -1,31 +0,0 @@
-using System;
-using System.Threading;
-
-namespace ET
-{
-    [ComponentOf(typeof(Scene))]
-    public class MainThreadSynchronizationContext: Entity, IAwake
-    {
-        private readonly ThreadSynchronizationContext threadSynchronizationContext = new();
-
-        public MainThreadSynchronizationContext()
-        {
-            SynchronizationContext.SetSynchronizationContext(this.threadSynchronizationContext);
-        }
-        
-        public void Update()
-        {
-            this.threadSynchronizationContext.Update();
-        }
-        
-        public void Post(SendOrPostCallback callback, object state)
-        {
-            this.Post(() => callback(state));
-        }
-		
-        public void Post(Action action)
-        {
-            this.threadSynchronizationContext.Post(action);
-        }
-    }
-}

+ 1 - 1
Unity/Assets/Scripts/Core/ThreadSynchronizationContext.cs

@@ -7,7 +7,7 @@ namespace ET
     public class ThreadSynchronizationContext : SynchronizationContext
     {
         // 线程同步队列,发送接收socket回调都放到该队列,由poll线程统一执行
-        private readonly ConcurrentQueue<Action> queue = new ConcurrentQueue<Action>();
+        private readonly ConcurrentQueue<Action> queue = new();
 
         private Action a;
 

+ 2 - 1
Unity/Assets/Scripts/Hotfix/Client/Demo/Router/HttpClientHelper.cs

@@ -1,6 +1,7 @@
 using System;
 using System.IO;
 using System.Net.Http;
+using System.Threading;
 
 namespace ET.Client
 {
@@ -10,7 +11,7 @@ namespace ET.Client
         {
             try
             {
-                using HttpClient httpClient = new HttpClient();
+                using HttpClient httpClient = new();
                 HttpResponseMessage response =  await httpClient.GetAsync(link);
                 string result = await response.Content.ReadAsStringAsync();
                 return result;

+ 7 - 0
Unity/Assets/Scripts/Loader/MonoBehaviour/Init.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Threading;
 using CommandLine;
 using UnityEngine;
 
@@ -6,10 +7,14 @@ namespace ET
 {
 	public class Init: MonoBehaviour
 	{
+		private readonly ThreadSynchronizationContext threadSynchronizationContext = new();
+		
 		private void Start()
 		{
 			DontDestroyOnLoad(gameObject);
 			
+			SynchronizationContext.SetSynchronizationContext(threadSynchronizationContext);
+
 			AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
 			{
 				Log.Error(e.ExceptionObject.ToString());
@@ -29,11 +34,13 @@ namespace ET
 
 		private void Update()
 		{
+			threadSynchronizationContext.Update();
 			FiberManager.Instance.Update();
 		}
 
 		private void LateUpdate()
 		{
+			threadSynchronizationContext.Update();
 			FiberManager.Instance.LateUpdate();
 		}