diff --git a/Assets/GameScripts/DotNet/Core/DataStructure/SkipTable/SkipTable.cs b/Assets/GameScripts/DotNet/Core/DataStructure/SkipTable/SkipTable.cs index 55e9ba0a..47af78b2 100644 --- a/Assets/GameScripts/DotNet/Core/DataStructure/SkipTable/SkipTable.cs +++ b/Assets/GameScripts/DotNet/Core/DataStructure/SkipTable/SkipTable.cs @@ -35,9 +35,9 @@ namespace TEngine.DataStructure if (layer <= rLevel) { var currentRight = cur.Right; - cur.Right = new SkipTableNode(sortKey, viceKey, key, value, - layer == 1 ? cur.Index + 1 : 0, cur, cur.Right, null); - + + cur.Right = new SkipTableNode(sortKey, viceKey, key, value, layer == 1 ? cur.Index + 1 : 0, cur, cur.Right, null); + if (currentRight != null) { currentRight.Left = cur.Right; diff --git a/Assets/GameScripts/DotNet/Core/Entitas/Entity.cs b/Assets/GameScripts/DotNet/Core/Entitas/Entity.cs index 04c119b9..bf45c2be 100644 --- a/Assets/GameScripts/DotNet/Core/Entitas/Entity.cs +++ b/Assets/GameScripts/DotNet/Core/Entitas/Entity.cs @@ -528,6 +528,7 @@ namespace TEngine try { + Scene = scene; #if TENGINE_NET RuntimeId = IdFactory.NextEntityId(scene.RouteId); #else @@ -546,7 +547,6 @@ namespace TEngine foreach (var entity in _treeDb) { entity.Parent = this; - entity.Scene = scene; entity.Deserialize(scene, resetId); _tree.Add(entity.GetType(), entity); } @@ -558,7 +558,6 @@ namespace TEngine foreach (var entity in _multiDb) { entity.Parent = this; - entity.Scene = scene; entity.Deserialize(scene, resetId); _multi.Add(entity.Id, (ISupportedMultiEntity)entity); } diff --git a/Assets/GameScripts/DotNet/Core/Log/LogCore.cs b/Assets/GameScripts/DotNet/Core/Log/LogCore.cs index 61e7626a..847e29da 100644 --- a/Assets/GameScripts/DotNet/Core/Log/LogCore.cs +++ b/Assets/GameScripts/DotNet/Core/Log/LogCore.cs @@ -217,7 +217,7 @@ namespace TEngine StringBuilder infoBuilder = GetFormatString(type, logString); - if (type == LogLevel.ERROR || type == LogLevel.WARNING || type == LogLevel.EXCEPTION) + if (type == LogLevel.ERROR || type == LogLevel.EXCEPTION) { StackFrame[] sf = new StackTrace().GetFrames(); for (int i = 0; i < sf.Length; i++) diff --git a/Assets/GameScripts/DotNet/Core/Modules/Session/SessionHeartbeatComponent.cs b/Assets/GameScripts/DotNet/Core/Modules/Session/SessionHeartbeatComponent.cs index 33258891..c0c8d466 100644 --- a/Assets/GameScripts/DotNet/Core/Modules/Session/SessionHeartbeatComponent.cs +++ b/Assets/GameScripts/DotNet/Core/Modules/Session/SessionHeartbeatComponent.cs @@ -26,6 +26,7 @@ namespace TEngine.Logic { _session = (Session)Parent; _selfRunTimeId = RuntimeId; + RepeatedSend().Coroutine(); _timerId = TimerScheduler.Instance.Unity.RepeatedTimer(interval, () => RepeatedSend().Coroutine()); } @@ -57,6 +58,7 @@ namespace TEngine.Logic var responseTime = TimeHelper.Now; Ping = (int)(responseTime - requestTime) / 2; TimeHelper.TimeDiff = pingResponse.Now + Ping - responseTime; + Log.Info("----------- HeartBeat -----------"); } } } diff --git a/Assets/GameScripts/DotNet/Core/Network/Message/Addressable/AddressableRouteComponent.cs b/Assets/GameScripts/DotNet/Core/Network/Message/Addressable/AddressableRouteComponent.cs index abc0351d..853f5920 100644 --- a/Assets/GameScripts/DotNet/Core/Network/Message/Addressable/AddressableRouteComponent.cs +++ b/Assets/GameScripts/DotNet/Core/Network/Message/Addressable/AddressableRouteComponent.cs @@ -1,50 +1,26 @@ -#pragma warning disable CS8603 -#pragma warning disable CS8600 #if TENGINE_NET namespace TEngine.Core.Network; -public sealed class AddressableRouteComponentAwakeSystem : AwakeSystem -{ - protected override void Awake(AddressableRouteComponent self) - { - self.Awake(); - } -} - /// /// 可寻址消息组件、挂载了这个组件可以接收和发送Addressable消息 /// public sealed class AddressableRouteComponent : Entity { - private long _parentId; - private long _addressableRouteId; + private long _routeId; + private long _addressableId; + public static readonly CoroutineLockQueueType AddressableRouteMessageLock = new CoroutineLockQueueType("AddressableRouteMessageLock"); public override void Dispose() { - _parentId = 0; - _addressableRouteId = 0; + _routeId = 0; + _addressableId = 0; base.Dispose(); } - - public void Awake() - { - if (Parent == null) - { - throw new Exception("AddressableRouteComponent must be mounted under a component"); - } - - if (Parent.RuntimeId == 0) - { - throw new Exception("AddressableRouteComponent.Parent.RuntimeId is null"); - } - _parentId = Parent.Id; - } - - public void SetAddressableRouteId(long addressableRouteId) + public void SetAddressableId(long addressableId) { - _addressableRouteId = addressableRouteId; + _addressableId = addressableId; } public void Send(IAddressableRouteMessage message) @@ -68,21 +44,21 @@ public sealed class AddressableRouteComponent : Entity var runtimeId = RuntimeId; IResponse iRouteResponse = null; - using (await AddressableRouteMessageLock.Lock(_parentId, "AddressableRouteComponent Call MemoryStream")) + using (await AddressableRouteMessageLock.Lock(_addressableId, "AddressableRouteComponent Call MemoryStream")) { while (!IsDisposed) { - if (_addressableRouteId == 0) + if (_routeId == 0) { - _addressableRouteId = await AddressableHelper.GetAddressableRouteId(Scene, _parentId); + _routeId = await AddressableHelper.GetAddressableRouteId(Scene, _addressableId); } - if (_addressableRouteId == 0) + if (_routeId == 0) { return MessageDispatcherSystem.Instance.CreateResponse(requestType, CoreErrorCode.ErrNotFoundRoute); } - iRouteResponse = await MessageHelper.CallInnerRoute(Scene, _addressableRouteId, routeTypeOpCode, requestType, request); + iRouteResponse = await MessageHelper.CallInnerRoute(Scene, _routeId, routeTypeOpCode, requestType, request); if (runtimeId != RuntimeId) { @@ -99,7 +75,7 @@ public sealed class AddressableRouteComponent : Entity { if (++failCount > 20) { - Log.Error($"AddressableComponent.Call failCount > 20 route send message fail, routeId: {_addressableRouteId} AddressableRouteComponent:{Id}"); + Log.Error($"AddressableComponent.Call failCount > 20 route send message fail, routeId: {_routeId} AddressableRouteComponent:{Id}"); return iRouteResponse; } @@ -110,7 +86,7 @@ public sealed class AddressableRouteComponent : Entity iRouteResponse.ErrorCode = CoreErrorCode.ErrRouteTimeout; } - _addressableRouteId = 0; + _routeId = 0; continue; } default: @@ -134,21 +110,21 @@ public sealed class AddressableRouteComponent : Entity var failCount = 0; var runtimeId = RuntimeId; - using (await AddressableRouteMessageLock.Lock(_parentId,"AddressableRouteComponent Call")) + using (await AddressableRouteMessageLock.Lock(_addressableId,"AddressableRouteComponent Call")) { while (true) { - if (_addressableRouteId == 0) + if (_routeId == 0) { - _addressableRouteId = await AddressableHelper.GetAddressableRouteId(Scene, _parentId); + _routeId = await AddressableHelper.GetAddressableRouteId(Scene, _addressableId); } - if (_addressableRouteId == 0) + if (_routeId == 0) { return MessageDispatcherSystem.Instance.CreateResponse(request, CoreErrorCode.ErrNotFoundRoute); } - var iRouteResponse = await MessageHelper.CallInnerRoute(Scene, _addressableRouteId, request); + var iRouteResponse = await MessageHelper.CallInnerRoute(Scene, _routeId, request); if (runtimeId != RuntimeId) { @@ -161,7 +137,7 @@ public sealed class AddressableRouteComponent : Entity { if (++failCount > 20) { - Log.Error($"AddressableRouteComponent.Call failCount > 20 route send message fail, routeId: {_addressableRouteId} AddressableRouteComponent:{Id}"); + Log.Error($"AddressableRouteComponent.Call failCount > 20 route send message fail, routeId: {_routeId} AddressableRouteComponent:{Id}"); return iRouteResponse; } @@ -172,7 +148,7 @@ public sealed class AddressableRouteComponent : Entity iRouteResponse.ErrorCode = CoreErrorCode.ErrRouteTimeout; } - _addressableRouteId = 0; + _routeId = 0; continue; } case CoreErrorCode.ErrRouteTimeout: diff --git a/Assets/GameScripts/DotNet/Core/Network/Message/Interface/Handler/IRouteMessageHandler.cs b/Assets/GameScripts/DotNet/Core/Network/Message/Interface/Handler/IRouteMessageHandler.cs index 17985b44..bb362cdf 100644 --- a/Assets/GameScripts/DotNet/Core/Network/Message/Interface/Handler/IRouteMessageHandler.cs +++ b/Assets/GameScripts/DotNet/Core/Network/Message/Interface/Handler/IRouteMessageHandler.cs @@ -144,7 +144,7 @@ namespace TEngine.Core.Network scene = entity.Scene; } - Log.Error($"SceneWorld:{session.Scene.World.Id} SceneRouteId:{scene.RouteId} SceneType:{scene.SceneInfo.SceneType} EntityId {tEntity.Id} : Error {e}"); + Log.Error($"SceneWorld:{session.Scene.World?.Id} SceneRouteId:{scene.RouteId} SceneType:{scene.SceneInfo.SceneType} EntityId {tEntity.Id} : Error {e}"); } finally { diff --git a/Assets/GameScripts/HotFix/GameLogic/NetWorkDemo/Examples/Network/UIEntry.cs b/Assets/GameScripts/HotFix/GameLogic/NetWorkDemo/Examples/Network/UIEntry.cs index be264e19..9877305c 100644 --- a/Assets/GameScripts/HotFix/GameLogic/NetWorkDemo/Examples/Network/UIEntry.cs +++ b/Assets/GameScripts/HotFix/GameLogic/NetWorkDemo/Examples/Network/UIEntry.cs @@ -75,7 +75,7 @@ namespace TEngine.Demo private void OnConnectComplete() { IsConnect = true; - Scene.Session.AddComponent().Start(15); + Scene.Session.AddComponent().Start(15000); LogDebug("已连接到服务器"); } diff --git a/DotNet/App/Program.cs b/DotNet/App/Program.cs index 6b365b94..d17c4345 100644 --- a/DotNet/App/Program.cs +++ b/DotNet/App/Program.cs @@ -24,9 +24,4 @@ try catch (Exception e) { Log.Error(e); -} - - - - - +} \ No newline at end of file diff --git a/DotNet/Config/ProtoBuf/InnerMessage.proto b/DotNet/Config/ProtoBuf/InnerMessage.proto index b0cece13..7c31ca24 100644 --- a/DotNet/Config/ProtoBuf/InnerMessage.proto +++ b/DotNet/Config/ProtoBuf/InnerMessage.proto @@ -3,10 +3,10 @@ package Sining.Message; /// Gate跟Map服务器进行通讯、注册Address协议 message I_G2M_LoginAddressRequest // IRouteRequest,I_M2G_LoginAddressResponse { - long AddressId = 1; // 用来关联Address的Id,一般是账号Id或UnitId这些不会变动的 + long AddressableId = 1; // 用来关联Address的Id,一般是账号Id或UnitId这些不会变动的 long GateRouteId = 2; // Gate的RouteIdId用于Map发送给客户端时需要 } message I_M2G_LoginAddressResponse // IRouteResponse { - + long AddressableId = 1; } \ No newline at end of file diff --git a/DotNet/Logic/src/Generate/NetworkProtocol/InnerMessage.cs b/DotNet/Logic/src/Generate/NetworkProtocol/InnerMessage.cs index e20dfa07..28da24f7 100644 --- a/DotNet/Logic/src/Generate/NetworkProtocol/InnerMessage.cs +++ b/DotNet/Logic/src/Generate/NetworkProtocol/InnerMessage.cs @@ -17,7 +17,7 @@ namespace TEngine public uint OpCode() { return InnerOpcode.I_G2M_LoginAddressRequest; } public long RouteTypeOpCode() { return CoreRouteType.Route; } [ProtoMember(1)] - public long AddressId { get; set; } + public long AddressableId { get; set; } [ProtoMember(2)] public long GateRouteId { get; set; } } @@ -27,5 +27,7 @@ namespace TEngine public uint OpCode() { return InnerOpcode.I_M2G_LoginAddressResponse; } [ProtoMember(91, IsRequired = true)] public uint ErrorCode { get; set; } + [ProtoMember(1)] + public long AddressableId { get; set; } } } diff --git a/DotNet/Logic/src/Handler/H_C2G_LoginAddressRequestHandler.cs b/DotNet/Logic/src/Handler/H_C2G_LoginAddressRequestHandler.cs index 9ee21579..60e37a0d 100644 --- a/DotNet/Logic/src/Handler/H_C2G_LoginAddressRequestHandler.cs +++ b/DotNet/Logic/src/Handler/H_C2G_LoginAddressRequestHandler.cs @@ -24,14 +24,14 @@ public class H_C2G_LoginAddressRequestHandler : MessageRPC(); + session.AddComponent().SetAddressableId(loginAddressResponse.AddressableId); } } #endif \ No newline at end of file diff --git a/DotNet/Logic/src/Handler/I_G2M_LoginAddressRequestHandler.cs b/DotNet/Logic/src/Handler/I_G2M_LoginAddressRequestHandler.cs index 1fe91d43..4e61d256 100644 --- a/DotNet/Logic/src/Handler/I_G2M_LoginAddressRequestHandler.cs +++ b/DotNet/Logic/src/Handler/I_G2M_LoginAddressRequestHandler.cs @@ -36,10 +36,10 @@ namespace TEngine.Logic // 一般这个信息是数据库里拿到或者其他服务器给传递过来了、这里主要演示怎么注册Address、所以这些步骤这里就不做了 // 这里我就模拟一个假的Unit数据使用 // 1、首先创建一个Unit - var unit = AddressManage.Add(scene, request.AddressId, request.GateRouteId); + var unit = AddressManage.Add(scene, request.AddressableId, request.GateRouteId); // 2、挂在AddressableMessageComponent组件、让这个Unit支持Address、并且会自动注册到网格中 await unit.AddComponent().Register(); - await FTask.CompletedTask; + response.AddressableId = unit.Id; } } } diff --git a/DotNet/Logic/src/Helper/AddressableSceneHelper.cs b/DotNet/Logic/src/Helper/AddressableSceneHelper.cs index 83466aa0..ea3dddd1 100644 --- a/DotNet/Logic/src/Helper/AddressableSceneHelper.cs +++ b/DotNet/Logic/src/Helper/AddressableSceneHelper.cs @@ -33,10 +33,10 @@ public static class AddressableSceneHelper return sceneEntityId; } - public static long GetSceneEntityIdByRouteId(uint routeId) + public static long GetSceneEntityIdBySceneId(uint sceneId) { var sceneEntityId = 0L; - var sceneConfig = SceneConfigData.Instance.Get(routeId); + var sceneConfig = SceneConfigData.Instance.Get(sceneId); sceneEntityId = sceneConfig.EntityId; return sceneEntityId; } diff --git a/DotNet/Logic/src/Helper/GameTickWatcher.cs b/DotNet/Logic/src/Helper/GameTickWatcher.cs new file mode 100644 index 00000000..f993bcbe --- /dev/null +++ b/DotNet/Logic/src/Helper/GameTickWatcher.cs @@ -0,0 +1,35 @@ +namespace TEngine.Helper; + +public class GameTickWatcher +{ + private long m_startTick = 0; + + public GameTickWatcher() + { + Refresh(); + } + + public void Refresh() + { + m_startTick = DateTime.Now.Ticks; + } + + /// + /// 计算用时。 + /// + /// + public float ElapseTime() + { + long endTick = DateTime.Now.Ticks; + return (endTick - m_startTick) / 10000f / 1000.0f; + } + + /// + /// 计算用时。 + /// + /// + public void LogElapseTime(string tag) + { + Console.WriteLine($"计算用时:{tag} 耗时 {this.ElapseTime()}"); + } +} \ No newline at end of file