Bladeren bron

ActorProxyComponent增加了一个GetWithActorId方法,假如已经知道了actorId(即actor的instanceId),就可以使用此方法,可以不用向location server的请求

tanghai 7 jaren geleden
bovenliggende
commit
b3f92f7302

+ 32 - 20
Server/Hotfix/Module/Actor/ActorProxySystem.cs

@@ -11,7 +11,24 @@ namespace ETHotfix
 	{
 		public override void Awake(ActorProxy self)
 		{
-			self.Awake();
+			self.LastSendTime = TimeHelper.Now();
+			self.tcs = null;
+			self.FailTimes = 0;
+			self.MaxFailTimes = 5;
+			self.ActorId = 0;
+		}
+	}
+	
+	[ObjectSystem]
+	public class ActorProxyAwake2System : AwakeSystem<ActorProxy, long>
+	{
+		public override void Awake(ActorProxy self, long actorId)
+		{
+			self.LastSendTime = TimeHelper.Now();
+			self.tcs = null;
+			self.FailTimes = 0;
+			self.MaxFailTimes = 0;
+			self.ActorId = actorId;
 		}
 	}
 
@@ -20,9 +37,13 @@ namespace ETHotfix
 	{
 		public override async void Start(ActorProxy self)
 		{
-			self.ActorInstanceId = await Game.Scene.GetComponent<LocationProxyComponent>().Get(self.Id);
+			if (self.ActorId == 0)
+			{
+				self.ActorId = await Game.Scene.GetComponent<LocationProxyComponent>().Get(self.Id);
+			}
+
 			self.Address = Game.Scene.GetComponent<StartConfigComponent>()
-					.Get(IdGenerater.GetAppIdFromId(self.ActorInstanceId))
+					.Get(IdGenerater.GetAppIdFromId(self.ActorId))
 					.GetComponent<InnerConfig>().IPEndPoint;
 
 			self.UpdateAsync();
@@ -43,7 +64,8 @@ namespace ETHotfix
 				actorTask.RunFail(ErrorCode.ERR_NotFoundActor);
 			}
 
-			self.failTimes = 0;
+			self.ActorId = 0;
+			self.FailTimes = 0;
 			var t = self.tcs;
 			self.tcs = null;
 			t?.SetResult(new ActorTask());
@@ -52,14 +74,6 @@ namespace ETHotfix
 
 	public static class ActorProxyEx
 	{
-		public static void Awake(this ActorProxy self)
-		{
-			self.LastSendTime = TimeHelper.Now();
-			self.tcs = null;
-			self.failTimes = 0;
-			self.CancellationTokenSource = new CancellationTokenSource();
-		}
-
 		private static void Add(this ActorProxy self, ActorTask task)
 		{
 			if (self.IsDisposed)
@@ -69,7 +83,7 @@ namespace ETHotfix
 
 			self.WaitingTasks.Enqueue(task);
 			// failtimes > 0表示正在重试,这时候不能加到正在发送队列
-			if (self.failTimes == 0)
+			if (self.FailTimes == 0)
 			{
 				self.AllowGet();
 			}
@@ -132,11 +146,10 @@ namespace ETHotfix
 				// 如果没找到Actor,重试
 				if (response.Error == ErrorCode.ERR_NotFoundActor)
 				{
-					self.CancellationTokenSource.Cancel();
-					++self.failTimes;
+					++self.FailTimes;
 
 					// 失败10次则清空actor发送队列,返回失败
-					if (self.failTimes > 10)
+					if (self.FailTimes > self.MaxFailTimes)
 					{
 						// 失败直接删除actorproxy
 						Log.Info($"actor send message fail, actorid: {self.Id}");
@@ -146,18 +159,17 @@ namespace ETHotfix
 
 					// 等待1s再发送
 					await Game.Scene.GetComponent<TimerComponent>().WaitAsync(1000);
-					self.ActorInstanceId = await Game.Scene.GetComponent<LocationProxyComponent>().Get(self.Id);
+					self.ActorId = await Game.Scene.GetComponent<LocationProxyComponent>().Get(self.Id);
 					self.Address = Game.Scene.GetComponent<StartConfigComponent>()
-							.Get(IdGenerater.GetAppIdFromId(self.ActorInstanceId))
+							.Get(IdGenerater.GetAppIdFromId(self.ActorId))
 							.GetComponent<InnerConfig>().IPEndPoint;
-					self.CancellationTokenSource = new CancellationTokenSource();
 					self.AllowGet();
 					return;
 				}
 
 				// 发送成功
 				self.LastSendTime = TimeHelper.Now();
-				self.failTimes = 0;
+				self.FailTimes = 0;
 
 				self.WaitingTasks.Dequeue();
 			}

+ 3 - 3
Server/Model/Module/Actor/ActorProxy.cs

@@ -10,7 +10,7 @@ namespace ETModel
 		// actor的地址
 		public IPEndPoint Address;
 
-		public long ActorInstanceId;
+		public long ActorId;
 		
 		// 还没发送的消息
 		public Queue<ActorTask> WaitingTasks = new Queue<ActorTask>();
@@ -20,8 +20,8 @@ namespace ETModel
 
 		public TaskCompletionSource<ActorTask> tcs;
 
-		public CancellationTokenSource CancellationTokenSource;
+		public int FailTimes;
 
-		public int failTimes;
+		public int MaxFailTimes;
 	}
 }

+ 14 - 0
Server/Model/Module/Actor/ActorProxyComponent.cs

@@ -75,6 +75,20 @@ namespace ETModel
 			this.ActorProxys[id] = actorProxy;
 			return actorProxy;
 		}
+		
+		public ActorProxy GetWithActorId(long actorId)
+		{
+			if (this.ActorProxys.TryGetValue(actorId, out ActorProxy actorProxy))
+			{
+				return actorProxy;
+			}
+			
+			actorProxy = ComponentFactory.CreateWithId<ActorProxy>(actorId);
+			actorProxy.ActorId = actorId;
+			actorProxy.MaxFailTimes = 0;
+			this.ActorProxys[actorId] = actorProxy;
+			return actorProxy;
+		}
 
 		public void Remove(long id)
 		{

+ 2 - 2
Server/Model/Module/Actor/ActorTask.cs

@@ -14,8 +14,8 @@ namespace ETModel
 		{
 			Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(this.proxy.Address);
 
-			this.message.ActorId = this.proxy.ActorInstanceId;
-			IResponse response = await session.Call(message, this.proxy.CancellationTokenSource.Token);
+			this.message.ActorId = this.proxy.ActorId;
+			IResponse response = await session.Call(message);
 
 			if (response.Error != ErrorCode.ERR_NotFoundActor)
 			{