Ver Fonte

Scheduler放到FiberManager中管理,创建Fiber需要指定使用哪个Scheduler

tanghai há 2 anos atrás
pai
commit
10478357a9
36 ficheiros alterados com 291 adições e 141 exclusões
  1. 2 4
      DotNet/App/Program.cs
  2. 1 1
      Share/Share.SourceGenerator/Generator/ETSystemGenerator/ETSystemGenerator.cs
  3. 14 0
      Unity/Assets/Config/Proto/LockStepInner_S_21001.proto
  4. BIN
      Unity/Assets/Plugins/Share.SourceGenerator.dll
  5. 1 0
      Unity/Assets/Scripts/Core/Entity/SceneType.cs
  6. 0 9
      Unity/Assets/Scripts/Core/Fiber/Fiber.cs
  7. 38 4
      Unity/Assets/Scripts/Core/World/Module/Fiber/FiberManager.cs
  8. 9 0
      Unity/Assets/Scripts/Core/World/Module/Fiber/IScheduler.cs
  9. 1 1
      Unity/Assets/Scripts/Core/World/Module/Fiber/IScheduler.cs.meta
  10. 19 8
      Unity/Assets/Scripts/Core/World/Module/Fiber/MainThreadScheduler.cs
  11. 1 1
      Unity/Assets/Scripts/Core/World/Module/Fiber/MainThreadScheduler.cs.meta
  12. 16 12
      Unity/Assets/Scripts/Core/World/Module/Fiber/ThreadPoolScheduler.cs
  13. 1 1
      Unity/Assets/Scripts/Core/World/Module/Fiber/ThreadPoolScheduler.cs.meta
  14. 19 15
      Unity/Assets/Scripts/Core/World/Module/Fiber/ThreadScheduler.cs
  15. 1 1
      Unity/Assets/Scripts/Core/World/Module/Fiber/ThreadScheduler.cs.meta
  16. 0 8
      Unity/Assets/Scripts/Core/World/Module/Navmesh.meta
  17. 0 8
      Unity/Assets/Scripts/Core/World/Module/Scheduler.meta
  18. 0 7
      Unity/Assets/Scripts/Core/World/Module/Scheduler/IScheduler.cs
  19. 1 3
      Unity/Assets/Scripts/Core/World/Singleton.cs
  20. 3 8
      Unity/Assets/Scripts/Hotfix/Server/Demo/EntryEvent2_InitServer.cs
  21. 4 3
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Map/C2Room_ChangeSceneFinishHandler.cs
  22. 4 3
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Map/FrameMessageHandler.cs
  23. 15 5
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Map/Match2Map_GetRoomHandler.cs
  24. 0 24
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Map/RoomManagerComponentSystem.cs
  25. 3 2
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Map/RoomServerComponentSystem.cs
  26. 4 3
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/C2Room_CheckHashHandler.cs
  27. 19 0
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/FiberInit_RoomRoot.cs
  28. 1 1
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/FiberInit_RoomRoot.cs.meta
  29. 3 2
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/G2Room_ReconnectHandler.cs
  30. 18 0
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/RoomManager2Room_InitHandler.cs
  31. 11 0
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/RoomManager2Room_InitHandler.cs.meta
  32. 2 2
      Unity/Assets/Scripts/Loader/MonoBehaviour/Init.cs
  33. 38 0
      Unity/Assets/Scripts/Model/Generate/ClientServer/Message/LockStepInner_S_21001.cs
  34. 38 0
      Unity/Assets/Scripts/Model/Generate/Server/Message/LockStepInner_S_21001.cs
  35. 1 1
      Unity/Assets/Scripts/Model/Server/LockStep/Map/RoomServerComponent.cs
  36. 3 4
      Unity/Assets/Scripts/Model/Share/Entry.cs

+ 2 - 4
DotNet/App/Program.cs

@@ -17,15 +17,13 @@ namespace ET
             Entry.Init();
             Init.Start();
             
-            MainThreadScheduler mainThreadScheduler = MainThreadScheduler.Instance;
-            
             while (true)
             {
                 Thread.Sleep(1);
                 try
                 {
-                    mainThreadScheduler.Update();
-                    mainThreadScheduler.LateUpdate();
+                    FiberManager.Instance.Update();
+                    FiberManager.Instance.LateUpdate();
                 }
                 catch (Exception e)
                 {

+ 1 - 1
Share/Share.SourceGenerator/Generator/ETSystemGenerator/ETSystemGenerator.cs

@@ -158,7 +158,7 @@ namespace {{namespaceName}}
                 string argsVars = string.Join(", ", argsVarsList);
                 string argsTypes = string.Join(", ", argsTypesList);
                 string argsTypesVars = string.Join(", ", argsTypeVarsList);
-                string argsTypesUnderLine = string.Join("_", argsTypesList).Replace(", ", "_").Replace(".", "_");
+                string argsTypesUnderLine = string.Join("_", argsTypesList).Replace(", ", "_").Replace(".", "_").Replace("<", "_").Replace(">", "_");
                 string argsTypesWithout0 = string.Join(", ", argsTypesWithout0List);
                 string argsVarsWithout0 = string.Join(", ", argsVarsWithout0List);
                 string argsTypesVarsWithout0 = string.Join(", ", argsTypeVarsWithout0List);

+ 14 - 0
Unity/Assets/Config/Proto/LockStepInner_S_21001.proto

@@ -50,4 +50,18 @@ message Room2G_Reconnect // IActorResponse
 	int64 StartTime = 4;
 	repeated LockStepUnitInfo UnitInfos = 5;
 	int32 Frame = 6;
+}
+
+//ResponseType Room2RoomManager_Init
+message RoomManager2Room_Init // IActorRequest
+{
+	int32 RpcId = 1;
+	repeated int64 PlayerIds = 2;
+}
+
+message Room2RoomManager_Init // IActorResponse
+{
+	int32 RpcId = 1;
+	int32 Error = 2;
+	string Message = 3;
 }

BIN
Unity/Assets/Plugins/Share.SourceGenerator.dll


+ 1 - 0
Unity/Assets/Scripts/Core/Entity/SceneType.cs

@@ -25,6 +25,7 @@ namespace ET
 		LockStepServer = 1 << 17,
 		Main = 1 << 18, // 主纤程,一个进程一个, 初始化从这里开始
 		NetInner = 1 << 19,  // 负责进程间消息通信
+		RoomRoot = 1 << 20,
 
 		// 客户端
 		Demo = 1 << 30,

+ 0 - 9
Unity/Assets/Scripts/Core/Fiber/Fiber.cs

@@ -78,15 +78,6 @@ namespace ET
 
         public void Dispose()
         {
-            if (this.IsDisposed)
-            {
-                return;
-            }
-
-            this.IsDisposed = true;
-            
-            this.IsRuning = false;
-            
             this.Root.Dispose();
         }
     }

+ 38 - 4
Unity/Assets/Scripts/Core/World/Module/Fiber/FiberManager.cs

@@ -5,24 +5,55 @@ using System.Threading;
 
 namespace ET
 {
+    public enum SchedulerType
+    {
+        Main,
+        Thread,
+        ThreadPool,
+    }
+    
     public class FiberManager: Singleton<FiberManager>, ISingletonAwake
     {
+        private readonly IScheduler[] schedulers = new IScheduler[3];
+        
         private int idGenerator = 10000000; // 10000000以下为保留的用于StartSceneConfig的fiber id, 1个区配置1000个纤程,可以配置10000个区
         private readonly ConcurrentDictionary<int, Fiber> fibers = new();
         
         public void Awake()
         {
+            this.schedulers[(int)SchedulerType.Main] = new MainThreadScheduler(this);
+            
+            //this.schedulers[(int)SchedulerType.Thread] = this.schedulers[(int)SchedulerType.Main];
+            //this.schedulers[(int)SchedulerType.ThreadPool] = this.schedulers[(int)SchedulerType.Main];
+            
+            this.schedulers[(int)SchedulerType.Thread] = new ThreadScheduler(this);
+            this.schedulers[(int)SchedulerType.ThreadPool] = new ThreadPoolScheduler(this);
+        }
+        
+        public void Update()
+        {
+            ((MainThreadScheduler)this.schedulers[0]).Update();
+        }
+
+        public void LateUpdate()
+        {
+            ((MainThreadScheduler)this.schedulers[0]).LateUpdate();
         }
 
         protected override void Destroy()
         {
+            foreach (IScheduler scheduler in this.schedulers)
+            {
+                scheduler.Dispose();
+            }
+            
             foreach (var kv in this.fibers)
             {
                 kv.Value.Dispose();
             }
         }
 
-        public int Create(int fiberId, int zone, SceneType sceneType, string name)
+        public int CreateFiber(SchedulerType schedulerType, int fiberId, int zone, SceneType sceneType, string name)
         {
             try
             {
@@ -38,6 +69,9 @@ namespace ET
                 EventSystem.Instance.Invoke((long)sceneType, new FiberInit() {Fiber = fiber});
                 
                 this.fibers[fiber.Id] = fiber;
+                
+                this.schedulers[(int) schedulerType].Add(fiberId);
+                
                 return fiberId;
             }
             catch (Exception e)
@@ -46,14 +80,14 @@ namespace ET
             }
         }
         
-        public int Create(int zone, SceneType sceneType, string name)
+        public int CreateFiber(SchedulerType schedulerType, int zone, SceneType sceneType, string name)
         {
             int fiberId = Interlocked.Increment(ref this.idGenerator);
-            return Create(fiberId, zone, sceneType, name);
+            return this.CreateFiber(schedulerType, fiberId, zone, sceneType, name);
         }
         
         // 不允许外部调用,只能由Schecher执行完成一帧再调用,否则容易出现多线程问题
-        internal void Remove(int id)
+        public void RemoveFiber(int id)
         {
             if (this.fibers.Remove(id, out Fiber fiber))
             {

+ 9 - 0
Unity/Assets/Scripts/Core/World/Module/Fiber/IScheduler.cs

@@ -0,0 +1,9 @@
+using System;
+
+namespace ET
+{
+    public interface IScheduler: IDisposable
+    {
+        void Add(int fiberId);
+    }
+}

+ 1 - 1
Unity/Assets/Scripts/Core/World/Module/Scheduler/IScheduler.cs.meta → Unity/Assets/Scripts/Core/World/Module/Fiber/IScheduler.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 1cee02a4a088ed8448c34d86037c8828
+guid: a8de74cf443d4f743a98f86531df4360
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 19 - 8
Unity/Assets/Scripts/Core/World/Module/Scheduler/MainThreadScheduler.cs → Unity/Assets/Scripts/Core/World/Module/Fiber/MainThreadScheduler.cs

@@ -1,14 +1,23 @@
-using System.Collections.Generic;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
 
 namespace ET
 {
-    public class MainThreadScheduler: Singleton<MainThreadScheduler>, IScheduler, ISingletonAwake
+    internal class MainThreadScheduler: IScheduler
     {
-        private readonly Queue<int> idQueue = new();
-        private readonly Queue<int> addIds = new();
+        private readonly ConcurrentQueue<int> idQueue = new();
+        private readonly ConcurrentQueue<int> addIds = new();
+        private readonly FiberManager fiberManager;
 
-        public void Awake()
+        public MainThreadScheduler(FiberManager fiberManager)
         {
+            this.fiberManager = fiberManager;
+        }
+
+        public void Dispose()
+        {
+            this.addIds.Clear();
+            this.idQueue.Clear();
         }
 
         public void Update()
@@ -21,7 +30,7 @@ namespace ET
                     continue;
                 }
 
-                Fiber fiber = FiberManager.Instance.Get(id);
+                Fiber fiber = this.fiberManager.Get(id);
                 if (fiber == null)
                 {
                     continue;
@@ -48,7 +57,7 @@ namespace ET
                     continue;
                 }
 
-                Fiber fiber = FiberManager.Instance.Get(id);
+                Fiber fiber = this.fiberManager.Get(id);
                 if (fiber == null)
                 {
                     continue;
@@ -66,10 +75,12 @@ namespace ET
 
             while (this.addIds.Count > 0)
             {
-                this.idQueue.Enqueue(this.addIds.Dequeue());
+                this.addIds.TryDequeue(out int result);
+                this.idQueue.Enqueue(result);
             }
         }
 
+
         public void Add(int fiberId = 0)
         {
             this.addIds.Enqueue(fiberId);

+ 1 - 1
Unity/Assets/Scripts/Core/World/Module/Scheduler/MainThreadScheduler.cs.meta → Unity/Assets/Scripts/Core/World/Module/Fiber/MainThreadScheduler.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 063e41713575def44ac7cc8305e4a4a4
+guid: bd9f51e035ab0784586df7b7e604072e
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 16 - 12
Unity/Assets/Scripts/Core/World/Module/Scheduler/ThreadPoolScheduler.cs → Unity/Assets/Scripts/Core/World/Module/Fiber/ThreadPoolScheduler.cs

@@ -5,21 +5,21 @@ using System.Threading;
 
 namespace ET
 {
-    public class ThreadPoolScheduler: Singleton<ThreadPoolScheduler>, IScheduler, ISingletonAwake<int>
+    internal class ThreadPoolScheduler: IScheduler
     {
-        private bool isStart;
-
         private readonly HashSet<Thread> threads = new();
 
-        private int ThreadCount { get; set; }
+        private int threadCount { get; set; }
 
         private readonly ConcurrentQueue<int> idQueue = new();
+        
+        private readonly FiberManager fiberManager;
 
-        public void Awake(int count)
+        public ThreadPoolScheduler(FiberManager fiberManager)
         {
-            this.isStart = true;
-            this.ThreadCount = count;
-            for (int i = 0; i < this.ThreadCount; ++i)
+            this.fiberManager = fiberManager;
+            this.threadCount = Environment.ProcessorCount;
+            for (int i = 0; i < this.threadCount; ++i)
             {
                 this.threads.Add(new Thread(this.Loop));
             }
@@ -32,17 +32,22 @@ namespace ET
 
         private void Loop()
         {
-            while (this.isStart)
+            while (true)
             {
                 try
                 {
+                    if (this.fiberManager.IsDisposed())
+                    {
+                        return;
+                    }
+                    
                     if (!this.idQueue.TryDequeue(out int id))
                     {
                         Thread.Sleep(1);
                         continue;
                     }
 
-                    Fiber fiber = FiberManager.Instance.Get(id);
+                    Fiber fiber = this.fiberManager.Get(id);
                     if (fiber == null)
                     {
                         continue;
@@ -71,9 +76,8 @@ namespace ET
             }
         }
 
-        protected override void Destroy()
+        public void Dispose()
         {
-            this.isStart = false;
             foreach (Thread thread in this.threads)
             {
                 thread.Join();

+ 1 - 1
Unity/Assets/Scripts/Core/World/Module/Scheduler/ThreadPoolScheduler.cs.meta → Unity/Assets/Scripts/Core/World/Module/Fiber/ThreadPoolScheduler.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 7b43fc7847a1b0c4482d09dbb954d036
+guid: d14b7a106ddb98e4f928f6aeef60d86f
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 19 - 15
Unity/Assets/Scripts/Core/World/Module/Scheduler/ThreadScheduler.cs → Unity/Assets/Scripts/Core/World/Module/Fiber/ThreadScheduler.cs

@@ -6,27 +6,36 @@ using System.Threading;
 namespace ET
 {
     // 一个Process一个固定的线程
-    public class ThreadScheduler: Singleton<ThreadScheduler>, ISingletonAwake, IScheduler
+    internal class ThreadScheduler: IScheduler
     {
         private readonly ConcurrentDictionary<int, Thread> dictionary = new();
+        
+        private readonly FiberManager fiberManager;
 
-        public void Awake()
+        public ThreadScheduler(FiberManager fiberManager)
         {
+            this.fiberManager = fiberManager;
         }
 
         private void Loop(int fiberId)
         {
-            Fiber fiber = FiberManager.Instance.Get(fiberId);
-            if (fiber == null)
-            {
-                return;
-            }
-
             while (true)
             {
                 try
                 {
-                    if (this.IsDisposed())
+                    if (this.fiberManager.IsDisposed())
+                    {
+                        return;
+                    }
+                    
+                    Fiber fiber = fiberManager.Get(fiberId);
+                    if (fiber == null)
+                    {
+                        this.dictionary.Remove(fiberId, out _);
+                        return;
+                    }
+                    
+                    if (fiber.IsDisposed)
                     {
                         this.dictionary.Remove(fiberId, out _);
                         return;
@@ -44,7 +53,7 @@ namespace ET
             }
         }
 
-        protected override void Destroy()
+        public void Dispose()
         {
             foreach (var kv in this.dictionary.ToArray())
             {
@@ -54,11 +63,6 @@ namespace ET
 
         public void Add(int fiberId)
         {
-            if (this.IsDisposed())
-            {
-                return;
-            }
-            
             Thread thread = new(() => this.Loop(fiberId));
             this.dictionary.TryAdd(fiberId, thread);
             thread.Start();

+ 1 - 1
Unity/Assets/Scripts/Core/World/Module/Scheduler/ThreadScheduler.cs.meta → Unity/Assets/Scripts/Core/World/Module/Fiber/ThreadScheduler.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: be7f088b694f6e14fbb523ab58ae904d
+guid: 7267a4e71eb917547afb0bdd52d9a360
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 0 - 8
Unity/Assets/Scripts/Core/World/Module/Navmesh.meta

@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 7a2d4985eaa40ee49b853ff594ffe06d
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 8
Unity/Assets/Scripts/Core/World/Module/Scheduler.meta

@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: 4bce9ed9829328d4f8bb502943732302
-folderAsset: yes
-DefaultImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 7
Unity/Assets/Scripts/Core/World/Module/Scheduler/IScheduler.cs

@@ -1,7 +0,0 @@
-namespace ET
-{
-    public interface IScheduler
-    {
-        void Add(int fiberId);
-    }
-}

+ 1 - 3
Unity/Assets/Scripts/Core/World/Singleton.cs

@@ -11,7 +11,7 @@ namespace ET
     
     public abstract class Singleton<T>: ISingleton where T: Singleton<T>, new()
     {
-        private bool isDisposed;
+        protected bool isDisposed;
         
         [StaticField]
         private static T instance;
@@ -51,8 +51,6 @@ namespace ET
             }
             
             this.isDisposed = true;
-
-            Instance = null;
             
             this.Destroy();
         }

+ 3 - 8
Unity/Assets/Scripts/Hotfix/Server/Demo/EntryEvent2_InitServer.cs

@@ -14,19 +14,14 @@ namespace ET.Server
             {
                 case AppType.Server:
                 {
-                    World.Instance.AddSingleton<ThreadPoolScheduler, int>(Environment.ProcessorCount);
-                    World.Instance.AddSingleton<ThreadScheduler>();
-                    
                     // 创建进程通信纤程
-                    int fiberId = FiberManager.Instance.Create(ConstFiberId.NetInner, 0, SceneType.NetInner, SceneType.NetInner.ToString());
-                    MainThreadScheduler.Instance.Add(fiberId);
-                    
+                    FiberManager.Instance.CreateFiber(SchedulerType.ThreadPool, ConstFiberId.NetInner, 0, SceneType.NetInner, SceneType.NetInner.ToString());
+
                     // 根据配置创建纤程
                     var processScenes = StartSceneConfigCategory.Instance.GetByProcess(root.Fiber().Process);
                     foreach (StartSceneConfig startConfig in processScenes)
                     {
-                        fiberId = FiberManager.Instance.Create(startConfig.Id, startConfig.Zone, startConfig.Type, startConfig.Name);
-                        MainThreadScheduler.Instance.Add(fiberId);
+                        FiberManager.Instance.CreateFiber(SchedulerType.ThreadPool, startConfig.Id, startConfig.Zone, startConfig.Type, startConfig.Name);
                     }
 
                     break;

+ 4 - 3
Unity/Assets/Scripts/Hotfix/Server/LockStep/Map/C2Room_ChangeSceneFinishHandler.cs

@@ -3,12 +3,13 @@ using TrueSync;
 
 namespace ET.Server
 {
-    [ActorMessageHandler(SceneType.Room)]
+    [ActorMessageHandler(SceneType.RoomRoot)]
     [FriendOf(typeof (RoomServerComponent))]
-    public class C2Room_ChangeSceneFinishHandler: ActorMessageHandler<Room, C2Room_ChangeSceneFinish>
+    public class C2Room_ChangeSceneFinishHandler: ActorMessageHandler<Scene, C2Room_ChangeSceneFinish>
     {
-        protected override async ETTask Run(Room room, C2Room_ChangeSceneFinish message)
+        protected override async ETTask Run(Scene root, C2Room_ChangeSceneFinish message)
         {
+            Room room = root.GetComponent<Room>();
             RoomServerComponent roomServerComponent = room.GetComponent<RoomServerComponent>();
             RoomPlayer roomPlayer = room.GetComponent<RoomServerComponent>().GetChild<RoomPlayer>(message.PlayerId);
             roomPlayer.Progress = 100;

+ 4 - 3
Unity/Assets/Scripts/Hotfix/Server/LockStep/Map/FrameMessageHandler.cs

@@ -3,11 +3,12 @@ using System.Collections.Generic;
 
 namespace ET.Server
 {
-    [ActorMessageHandler(SceneType.Room)]
-    public class FrameMessageHandler: ActorMessageHandler<Room, FrameMessage>
+    [ActorMessageHandler(SceneType.RoomRoot)]
+    public class FrameMessageHandler: ActorMessageHandler<Scene, FrameMessage>
     {
-        protected override async ETTask Run(Room room, FrameMessage message)
+        protected override async ETTask Run(Scene root, FrameMessage message)
         {
+            Room room = root.GetComponent<Room>();
             FrameBuffer frameBuffer = room.FrameBuffer;
             
             if (message.Frame % (1000 / LSConstValue.UpdateInterval) == 0)

+ 15 - 5
Unity/Assets/Scripts/Hotfix/Server/LockStep/Map/Match2Map_GetRoomHandler.cs

@@ -1,16 +1,26 @@
 using System;
-
+using System.Collections.Generic;
 
 namespace ET.Server
 {
 	[ActorMessageHandler(SceneType.Map)]
 	public class Match2Map_GetRoomHandler : ActorMessageHandler<Scene, Match2Map_GetRoom, Map2Match_GetRoom>
 	{
-		protected override async ETTask Run(Scene scene, Match2Map_GetRoom request, Map2Match_GetRoom response)
+		protected override async ETTask Run(Scene root, Match2Map_GetRoom request, Map2Match_GetRoom response)
 		{
-			RoomManagerComponent roomManagerComponent = scene.GetComponent<RoomManagerComponent>();
-			Room room = await roomManagerComponent.CreateServerRoom(request);
-			response.ActorId = room.GetActorId();
+			//RoomManagerComponent roomManagerComponent = root.GetComponent<RoomManagerComponent>();
+			
+			Fiber fiber = root.Fiber();
+			int fiberId = FiberManager.Instance.CreateFiber(SchedulerType.ThreadPool, fiber.Zone, SceneType.RoomRoot, "RoomRoot");
+			ActorId roomRootActorId = new(fiber.Process, fiberId);
+
+			// 发送消息给房间纤程,初始化
+			RoomManager2Room_Init roomManager2RoomInit = RoomManager2Room_Init.Create(true);
+			roomManager2RoomInit.PlayerIds = new List<long>();
+			roomManager2RoomInit.PlayerIds.AddRange(request.PlayerIds);
+			await root.GetComponent<ActorSenderComponent>().Call(roomRootActorId, roomManager2RoomInit);
+			
+			response.ActorId = roomRootActorId;
 			await ETTask.CompletedTask;
 		}
 	}

+ 0 - 24
Unity/Assets/Scripts/Hotfix/Server/LockStep/Map/RoomManagerComponentSystem.cs

@@ -1,24 +0,0 @@
-using System;
-
-namespace ET.Server
-{
-
-    public static partial class RoomManagerComponentSystem
-    {
-        public static async ETTask<Room> CreateServerRoom(this RoomManagerComponent self, Match2Map_GetRoom request)
-        {
-            await ETTask.CompletedTask;
-            
-            Room room = self.AddChild<Room>();
-            room.Name = "Server";
-            
-            room.AddComponent<RoomServerComponent, Match2Map_GetRoom>(request);
-
-            room.LSWorld = new LSWorld(SceneType.LockStepServer);
-
-            room.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
-            
-            return room;
-        }
-    }
-}

+ 3 - 2
Unity/Assets/Scripts/Hotfix/Server/LockStep/Map/RoomServerComponentSystem.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Collections.Generic;
 
 namespace ET.Server
 {
@@ -6,9 +7,9 @@ namespace ET.Server
     public static partial class RoomServerComponentSystem
     {
         [EntitySystem]
-        private static void Awake(this RoomServerComponent self, Match2Map_GetRoom match2MapGetRoom)
+        private static void Awake(this RoomServerComponent self, List<long> playerIds)
         {
-            foreach (long id in match2MapGetRoom.PlayerIds)
+            foreach (long id in playerIds)
             {
                 RoomPlayer roomPlayer = self.AddChildWithId<RoomPlayer>(id);
             }

+ 4 - 3
Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/C2Room_CheckHashHandler.cs

@@ -1,10 +1,11 @@
 namespace ET.Server
 {
-    [ActorMessageHandler(SceneType.Room)]
-    public class C2Room_CheckHashHandler: ActorMessageHandler<Room, C2Room_CheckHash>
+    [ActorMessageHandler(SceneType.RoomRoot)]
+    public class C2Room_CheckHashHandler: ActorMessageHandler<Scene, C2Room_CheckHash>
     {
-        protected override async ETTask Run(Room room, C2Room_CheckHash message)
+        protected override async ETTask Run(Scene root, C2Room_CheckHash message)
         {
+            Room room = root.GetComponent<Room>();
             long hash = room.FrameBuffer.GetHash(message.Frame);
             if (message.Hash != hash)
             {

+ 19 - 0
Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/FiberInit_RoomRoot.cs

@@ -0,0 +1,19 @@
+using System.Net;
+
+namespace ET.Server
+{
+    [Invoke((long)SceneType.RoomRoot)]
+    public class FiberInit_RoomRoot: AInvokeHandler<FiberInit>
+    {
+        public override void Handle(FiberInit fiberInit)
+        {
+            Scene root = fiberInit.Fiber.Root;
+
+            Room room = root.AddChild<Room>();
+            root.AddComponent<LocationProxyComponent>();
+            root.AddComponent<ActorLocationSenderComponent>();
+            
+            room.Name = "Server";
+        }
+    }
+}

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Server/LockStep/Map/RoomManagerComponentSystem.cs.meta → Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/FiberInit_RoomRoot.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 242c6c229fa3944b9ab71bb01d077b74
+guid: 6975fc1c87e4bcf46bdd02dc8bb89bc4
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 3 - 2
Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/G2Room_ReconnectHandler.cs

@@ -3,10 +3,11 @@ using System.Collections.Generic;
 namespace ET.Server
 {
     [ActorMessageHandler(SceneType.Room)]
-    public class G2Room_ReconnectHandler: ActorMessageHandler<Room, G2Room_Reconnect, Room2G_Reconnect>
+    public class G2Room_ReconnectHandler: ActorMessageHandler<Scene, G2Room_Reconnect, Room2G_Reconnect>
     {
-        protected override async ETTask Run(Room room, G2Room_Reconnect request, Room2G_Reconnect response)
+        protected override async ETTask Run(Scene root, G2Room_Reconnect request, Room2G_Reconnect response)
         {
+            Room room = root.GetComponent<Room>();
             response.StartTime = room.StartTime;
             response.UnitInfos = new List<LockStepUnitInfo>();
             LSUnitComponent lsUnitComponent = room.LSWorld.GetComponent<LSUnitComponent>();

+ 18 - 0
Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/RoomManager2Room_InitHandler.cs

@@ -0,0 +1,18 @@
+using System.Collections.Generic;
+
+namespace ET.Server
+{
+    [ActorMessageHandler(SceneType.RoomRoot)]
+    public class RoomManager2Room_InitHandler: ActorMessageHandler<Scene, RoomManager2Room_Init, Room2RoomManager_Init>
+    {
+        protected override async ETTask Run(Scene root, RoomManager2Room_Init request, Room2RoomManager_Init response)
+        {
+            Room room = root.AddComponent<Room>();
+            
+            room.AddComponent<RoomServerComponent, List<long>>(request.PlayerIds);
+
+            room.LSWorld = new LSWorld(SceneType.LockStepServer);
+            await ETTask.CompletedTask;
+        }
+    }
+}

+ 11 - 0
Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/RoomManager2Room_InitHandler.cs.meta

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

+ 2 - 2
Unity/Assets/Scripts/Loader/MonoBehaviour/Init.cs

@@ -29,12 +29,12 @@ namespace ET
 
 		private void Update()
 		{
-			MainThreadScheduler.Instance.Update();
+			FiberManager.Instance.Update();
 		}
 
 		private void LateUpdate()
 		{
-			MainThreadScheduler.Instance.LateUpdate();
+			FiberManager.Instance.LateUpdate();
 		}
 
 		private void OnApplicationQuit()

+ 38 - 0
Unity/Assets/Scripts/Model/Generate/ClientServer/Message/LockStepInner_S_21001.cs

@@ -125,6 +125,42 @@ namespace ET
 
 	}
 
+	[ResponseType(nameof(Room2RoomManager_Init))]
+	[Message(LockStepInner.RoomManager2Room_Init)]
+	[MemoryPackable]
+	public partial class RoomManager2Room_Init: MessageObject, IActorRequest
+	{
+		public static RoomManager2Room_Init Create(bool isFromPool = false) { return !isFromPool? new RoomManager2Room_Init() : ObjectPool.Instance.Fetch(typeof(RoomManager2Room_Init)) as RoomManager2Room_Init; }
+
+		public override void Dispose() { ObjectPool.Instance.Recycle(this); }
+
+		[MemoryPackOrder(0)]
+		public int RpcId { get; set; }
+
+		[MemoryPackOrder(1)]
+		public List<long> PlayerIds { get; set; }
+
+	}
+
+	[Message(LockStepInner.Room2RoomManager_Init)]
+	[MemoryPackable]
+	public partial class Room2RoomManager_Init: MessageObject, IActorResponse
+	{
+		public static Room2RoomManager_Init Create(bool isFromPool = false) { return !isFromPool? new Room2RoomManager_Init() : ObjectPool.Instance.Fetch(typeof(Room2RoomManager_Init)) as Room2RoomManager_Init; }
+
+		public override void Dispose() { ObjectPool.Instance.Recycle(this); }
+
+		[MemoryPackOrder(0)]
+		public int RpcId { get; set; }
+
+		[MemoryPackOrder(1)]
+		public int Error { get; set; }
+
+		[MemoryPackOrder(2)]
+		public string Message { get; set; }
+
+	}
+
 	public static class LockStepInner
 	{
 		 public const ushort G2Match_Match = 21002;
@@ -133,5 +169,7 @@ namespace ET
 		 public const ushort Map2Match_GetRoom = 21005;
 		 public const ushort G2Room_Reconnect = 21006;
 		 public const ushort Room2G_Reconnect = 21007;
+		 public const ushort RoomManager2Room_Init = 21008;
+		 public const ushort Room2RoomManager_Init = 21009;
 	}
 }

+ 38 - 0
Unity/Assets/Scripts/Model/Generate/Server/Message/LockStepInner_S_21001.cs

@@ -125,6 +125,42 @@ namespace ET
 
 	}
 
+	[ResponseType(nameof(Room2RoomManager_Init))]
+	[Message(LockStepInner.RoomManager2Room_Init)]
+	[MemoryPackable]
+	public partial class RoomManager2Room_Init: MessageObject, IActorRequest
+	{
+		public static RoomManager2Room_Init Create(bool isFromPool = false) { return !isFromPool? new RoomManager2Room_Init() : ObjectPool.Instance.Fetch(typeof(RoomManager2Room_Init)) as RoomManager2Room_Init; }
+
+		public override void Dispose() { ObjectPool.Instance.Recycle(this); }
+
+		[MemoryPackOrder(0)]
+		public int RpcId { get; set; }
+
+		[MemoryPackOrder(1)]
+		public List<long> PlayerIds { get; set; }
+
+	}
+
+	[Message(LockStepInner.Room2RoomManager_Init)]
+	[MemoryPackable]
+	public partial class Room2RoomManager_Init: MessageObject, IActorResponse
+	{
+		public static Room2RoomManager_Init Create(bool isFromPool = false) { return !isFromPool? new Room2RoomManager_Init() : ObjectPool.Instance.Fetch(typeof(Room2RoomManager_Init)) as Room2RoomManager_Init; }
+
+		public override void Dispose() { ObjectPool.Instance.Recycle(this); }
+
+		[MemoryPackOrder(0)]
+		public int RpcId { get; set; }
+
+		[MemoryPackOrder(1)]
+		public int Error { get; set; }
+
+		[MemoryPackOrder(2)]
+		public string Message { get; set; }
+
+	}
+
 	public static class LockStepInner
 	{
 		 public const ushort G2Match_Match = 21002;
@@ -133,5 +169,7 @@ namespace ET
 		 public const ushort Map2Match_GetRoom = 21005;
 		 public const ushort G2Room_Reconnect = 21006;
 		 public const ushort Room2G_Reconnect = 21007;
+		 public const ushort RoomManager2Room_Init = 21008;
+		 public const ushort Room2RoomManager_Init = 21009;
 	}
 }

+ 1 - 1
Unity/Assets/Scripts/Model/Server/LockStep/Map/RoomServerComponent.cs

@@ -3,7 +3,7 @@ using System.Collections.Generic;
 namespace ET.Server
 {
     [ComponentOf(typeof(Room))]
-    public class RoomServerComponent: Entity, IAwake<Match2Map_GetRoom>
+    public class RoomServerComponent: Entity, IAwake<List<long>>
     {
     }
 }

+ 3 - 4
Unity/Assets/Scripts/Model/Share/Entry.cs

@@ -47,15 +47,14 @@ namespace ET
             World.Instance.AddSingleton<NumericWatcherComponent>();
             World.Instance.AddSingleton<AIDispatcherComponent>();
             World.Instance.AddSingleton<ActorMessageDispatcherComponent>();
-            World.Instance.AddSingleton<FiberManager>();
             World.Instance.AddSingleton<NetServices>();
             World.Instance.AddSingleton<NavmeshComponent>();
-            MainThreadScheduler mainThreadScheduler = World.Instance.AddSingleton<MainThreadScheduler>();
+            
+            World.Instance.AddSingleton<FiberManager>();
             
             await World.Instance.AddSingleton<ConfigComponent>().LoadAsync();
             
-            int fiberId = FiberManager.Instance.Create(ConstFiberId.Main, 0, SceneType.Main, "");
-            mainThreadScheduler.Add(fiberId);
+            FiberManager.Instance.CreateFiber(SchedulerType.Main, ConstFiberId.Main, 0, SceneType.Main, "");
         }
     }
 }