From 68c2f85bd586f364d4cfd41b05338a7988b8460b Mon Sep 17 00:00:00 2001 From: tanghai Date: Mon, 4 Dec 2017 11:04:46 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=95=B0=E6=8D=AE=E5=BA=93=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E6=93=8D=E4=BD=9Ccomponent=202.=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E6=B1=A0=EF=BC=8C=E4=B8=8D=E4=BB=8E=E6=B1=A0=E4=B8=AD?= =?UTF-8?q?=E5=8F=96=E5=B0=B1=E4=B8=8D=E5=BA=94=E8=AF=A5=E5=9B=9E=E6=94=B6?= =?UTF-8?q?=E5=88=B0=E6=B1=A0=203.=E4=BC=98=E5=8C=96MultiMap=EF=BC=8C?= =?UTF-8?q?=E5=87=8F=E5=B0=91gc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Handler/DBQueryBatchRequestHandler.cs | 8 +-- .../Handler/DBQueryJsonRequestHandler.cs | 8 +-- .../Hotfix/Handler/DBQueryRequestHandler.cs | 8 +-- .../Handler/DBSaveBatchRequestHandler.cs | 8 +-- Server/Hotfix/Handler/DBSaveRequestHandler.cs | 6 +- Server/Model/Component/DBCacheComponent.cs | 60 +++++++++--------- Server/Model/Component/DBProxyComponent.cs | 26 ++++---- Server/Model/Entity/DBQueryBatchTask.cs | 20 +++--- Server/Model/Entity/DBQueryTask.cs | 20 +++--- Server/Model/Entity/Message/InnerMessage.cs | 2 +- Unity/Assets/Scripts/Base/MultiMap.cs | 36 ++++++++++- Unity/Assets/Scripts/Base/Object/Disposer.cs | 10 ++- .../Scripts/Base/Object/EntityFactory.cs | 4 +- .../Assets/Scripts/Base/Object/ObjectPool.cs | 6 +- .../Scripts/Component/NetworkComponent.cs | 4 +- Unity/Assets/Scripts/Entity/Session.cs | 62 ++++++++++++------- 16 files changed, 174 insertions(+), 114 deletions(-) diff --git a/Server/Hotfix/Handler/DBQueryBatchRequestHandler.cs b/Server/Hotfix/Handler/DBQueryBatchRequestHandler.cs index 6c1aba2c..42b94502 100644 --- a/Server/Hotfix/Handler/DBQueryBatchRequestHandler.cs +++ b/Server/Hotfix/Handler/DBQueryBatchRequestHandler.cs @@ -13,15 +13,15 @@ namespace Hotfix try { DBCacheComponent dbCacheComponent = Game.Scene.GetComponent(); - List entitys = await dbCacheComponent.GetBatch(message.CollectionName, message.IdList); + List disposers = await dbCacheComponent.GetBatch(message.CollectionName, message.IdList); - response.Entitys = entitys; + response.Disposers = disposers; if (message.NeedCache) { - foreach (Entity entity in entitys) + foreach (Disposer disposer in disposers) { - dbCacheComponent.AddToCache(entity, message.CollectionName); + dbCacheComponent.AddToCache(disposer, message.CollectionName); } } diff --git a/Server/Hotfix/Handler/DBQueryJsonRequestHandler.cs b/Server/Hotfix/Handler/DBQueryJsonRequestHandler.cs index d4dfb1b9..3dacaf77 100644 --- a/Server/Hotfix/Handler/DBQueryJsonRequestHandler.cs +++ b/Server/Hotfix/Handler/DBQueryJsonRequestHandler.cs @@ -13,15 +13,15 @@ namespace Hotfix try { DBCacheComponent dbCacheComponent = Game.Scene.GetComponent(); - List entitys = await dbCacheComponent.GetJson(message.CollectionName, message.Json); + List disposers = await dbCacheComponent.GetJson(message.CollectionName, message.Json); - response.Entitys = entitys; + response.Disposers = disposers; if (message.NeedCache) { - foreach (Entity entity in entitys) + foreach (Disposer disposer in disposers) { - dbCacheComponent.AddToCache(entity, message.CollectionName); + dbCacheComponent.AddToCache(disposer, message.CollectionName); } } diff --git a/Server/Hotfix/Handler/DBQueryRequestHandler.cs b/Server/Hotfix/Handler/DBQueryRequestHandler.cs index dd8567c7..d8ce2273 100644 --- a/Server/Hotfix/Handler/DBQueryRequestHandler.cs +++ b/Server/Hotfix/Handler/DBQueryRequestHandler.cs @@ -12,13 +12,13 @@ namespace Hotfix try { DBCacheComponent dbCacheComponent = Game.Scene.GetComponent(); - Entity entity = await dbCacheComponent.Get(message.CollectionName, message.Id); + Disposer disposer = await dbCacheComponent.Get(message.CollectionName, message.Id); - response.Entity = entity; + response.Disposer = disposer; - if (message.NeedCache && entity != null) + if (message.NeedCache && disposer != null) { - dbCacheComponent.AddToCache(entity, message.CollectionName); + dbCacheComponent.AddToCache(disposer, message.CollectionName); } reply(response); diff --git a/Server/Hotfix/Handler/DBSaveBatchRequestHandler.cs b/Server/Hotfix/Handler/DBSaveBatchRequestHandler.cs index 7de35a10..e5ea1c93 100644 --- a/Server/Hotfix/Handler/DBSaveBatchRequestHandler.cs +++ b/Server/Hotfix/Handler/DBSaveBatchRequestHandler.cs @@ -15,18 +15,18 @@ namespace Hotfix if (message.CollectionName == "") { - message.CollectionName = message.Entitys[0].GetType().Name; + message.CollectionName = message.Disposers[0].GetType().Name; } if (message.NeedCache) { - foreach (Entity entity in message.Entitys) + foreach (Disposer disposer in message.Disposers) { - dbCacheComponent.AddToCache(entity, message.CollectionName); + dbCacheComponent.AddToCache(disposer, message.CollectionName); } } - await dbCacheComponent.AddBatch(message.Entitys, message.CollectionName); + await dbCacheComponent.AddBatch(message.Disposers, message.CollectionName); reply(response); } diff --git a/Server/Hotfix/Handler/DBSaveRequestHandler.cs b/Server/Hotfix/Handler/DBSaveRequestHandler.cs index 7ba8b264..e8c1e37e 100644 --- a/Server/Hotfix/Handler/DBSaveRequestHandler.cs +++ b/Server/Hotfix/Handler/DBSaveRequestHandler.cs @@ -14,14 +14,14 @@ namespace Hotfix DBCacheComponent dbCacheComponent = Game.Scene.GetComponent(); if (message.CollectionName == "") { - message.CollectionName = message.Entity.GetType().Name; + message.CollectionName = message.Disposer.GetType().Name; } if (message.NeedCache) { - dbCacheComponent.AddToCache(message.Entity, message.CollectionName); + dbCacheComponent.AddToCache(message.Disposer, message.CollectionName); } - await dbCacheComponent.Add(message.Entity, message.CollectionName); + await dbCacheComponent.Add(message.Disposer, message.CollectionName); reply(response); } catch (Exception e) diff --git a/Server/Model/Component/DBCacheComponent.cs b/Server/Model/Component/DBCacheComponent.cs index ca009ff6..0fdd4e30 100644 --- a/Server/Model/Component/DBCacheComponent.cs +++ b/Server/Model/Component/DBCacheComponent.cs @@ -17,7 +17,7 @@ namespace Model /// public class DBCacheComponent : Component { - public Dictionary> cache = new Dictionary>(); + public Dictionary> cache = new Dictionary>(); public const int taskCount = 32; public List tasks = new List(taskCount); @@ -31,53 +31,53 @@ namespace Model } } - public Task Add(Entity entity, string collectionName = "") + public Task Add(Disposer disposer, string collectionName = "") { TaskCompletionSource tcs = new TaskCompletionSource(); - this.AddToCache(entity, collectionName); + this.AddToCache(disposer, collectionName); if (collectionName == "") { - collectionName = entity.GetType().Name; + collectionName = disposer.GetType().Name; } - DBSaveTask task = EntityFactory.CreateWithId>(entity.Id, entity, collectionName, tcs); + DBSaveTask task = EntityFactory.CreateWithId>(disposer.Id, disposer, collectionName, tcs); this.tasks[(int)((ulong)task.Id % taskCount)].Add(task); return tcs.Task; } - public Task AddBatch(List entitys, string collectionName) + public Task AddBatch(List disposers, string collectionName) { TaskCompletionSource tcs = new TaskCompletionSource(); - DBSaveBatchTask task = EntityFactory.Create, string, TaskCompletionSource>(entitys, collectionName, tcs); + DBSaveBatchTask task = EntityFactory.Create, string, TaskCompletionSource>(disposers, collectionName, tcs); this.tasks[(int)((ulong)task.Id % taskCount)].Add(task); return tcs.Task; } - public void AddToCache(Entity entity, string collectionName = "") + public void AddToCache(Disposer disposer, string collectionName = "") { if (collectionName == "") { - collectionName = entity.GetType().Name; + collectionName = disposer.GetType().Name; } - Dictionary collection; + Dictionary collection; if (!this.cache.TryGetValue(collectionName, out collection)) { - collection = new Dictionary(); + collection = new Dictionary(); this.cache.Add(collectionName, collection); } - collection[entity.Id] = entity; + collection[disposer.Id] = disposer; } - public Entity GetFromCache(string collectionName, long id) + public Disposer GetFromCache(string collectionName, long id) { - Dictionary d; + Dictionary d; if (!this.cache.TryGetValue(collectionName, out d)) { return null; } - Entity result; + Disposer result; if (!d.TryGetValue(id, out result)) { return null; @@ -87,7 +87,7 @@ namespace Model public void RemoveFromCache(string collectionName, long id) { - Dictionary d; + Dictionary d; if (!this.cache.TryGetValue(collectionName, out d)) { return; @@ -95,53 +95,53 @@ namespace Model d.Remove(id); } - public Task Get(string collectionName, long id) + public Task Get(string collectionName, long id) { - Entity entity = GetFromCache(collectionName, id); + Disposer entity = GetFromCache(collectionName, id); if (entity != null) { return Task.FromResult(entity); } - TaskCompletionSource tcs = new TaskCompletionSource(); - DBQueryTask dbQueryTask = EntityFactory.CreateWithId>(id, collectionName, tcs); + TaskCompletionSource tcs = new TaskCompletionSource(); + DBQueryTask dbQueryTask = EntityFactory.CreateWithId>(id, collectionName, tcs); this.tasks[(int)((ulong)id % taskCount)].Add(dbQueryTask); return tcs.Task; } - public Task> GetBatch(string collectionName, List idList) + public Task> GetBatch(string collectionName, List idList) { - List entitys = new List(); + List disposers = new List(); bool isAllInCache = true; foreach (long id in idList) { - Entity entity = this.GetFromCache(collectionName, id); + Disposer entity = this.GetFromCache(collectionName, id); if (entity == null) { isAllInCache = false; break; } - entitys.Add(entity); + disposers.Add(entity); } if (isAllInCache) { - return Task.FromResult(entitys); + return Task.FromResult(disposers); } - TaskCompletionSource> tcs = new TaskCompletionSource>(); - DBQueryBatchTask dbQueryBatchTask = EntityFactory.Create, string, TaskCompletionSource>>(idList, collectionName, tcs); + TaskCompletionSource> tcs = new TaskCompletionSource>(); + DBQueryBatchTask dbQueryBatchTask = EntityFactory.Create, string, TaskCompletionSource>>(idList, collectionName, tcs); this.tasks[(int)((ulong)dbQueryBatchTask.Id % taskCount)].Add(dbQueryBatchTask); return tcs.Task; } - public Task> GetJson(string collectionName, string json) + public Task> GetJson(string collectionName, string json) { - TaskCompletionSource> tcs = new TaskCompletionSource>(); + TaskCompletionSource> tcs = new TaskCompletionSource>(); - DBQueryJsonTask dbQueryJsonTask = EntityFactory.Create>>(collectionName, json, tcs); + DBQueryJsonTask dbQueryJsonTask = EntityFactory.Create>>(collectionName, json, tcs); this.tasks[(int)((ulong)dbQueryJsonTask.Id % taskCount)].Add(dbQueryJsonTask); return tcs.Task; diff --git a/Server/Model/Component/DBProxyComponent.cs b/Server/Model/Component/DBProxyComponent.cs index b59a9f75..3b5ec453 100644 --- a/Server/Model/Component/DBProxyComponent.cs +++ b/Server/Model/Component/DBProxyComponent.cs @@ -26,35 +26,35 @@ namespace Model dbAddress = dbStartConfig.GetComponent().Address; } - public async Task Save(Entity entity, bool needCache = true) + public async Task Save(Disposer disposer, bool needCache = true) { Session session = Game.Scene.GetComponent().Get(dbAddress); - await session.Call(new DBSaveRequest { Entity = entity, NeedCache = needCache}); + await session.Call(new DBSaveRequest { Disposer = disposer, NeedCache = needCache}); } - public async Task SaveBatch(List entitys, bool needCache = true) + public async Task SaveBatch(List disposers, bool needCache = true) { Session session = Game.Scene.GetComponent().Get(dbAddress); - await session.Call(new DBSaveBatchRequest { Entitys = entitys, NeedCache = needCache}); + await session.Call(new DBSaveBatchRequest { Disposers = disposers, NeedCache = needCache}); } - public async Task Save(Entity entity, bool needCache, CancellationToken cancellationToken) + public async Task Save(Disposer disposer, bool needCache, CancellationToken cancellationToken) { Session session = Game.Scene.GetComponent().Get(dbAddress); - await session.Call(new DBSaveRequest { Entity = entity, NeedCache = needCache}, cancellationToken); + await session.Call(new DBSaveRequest { Disposer = disposer, NeedCache = needCache}, cancellationToken); } - public async void SaveLog(Entity entity) + public async void SaveLog(Disposer disposer) { Session session = Game.Scene.GetComponent().Get(dbAddress); - await session.Call(new DBSaveRequest { Entity = entity, NeedCache = false, CollectionName = "Log" }); + await session.Call(new DBSaveRequest { Disposer = disposer, NeedCache = false, CollectionName = "Log" }); } public async Task Query(long id, bool needCache = true) where T: Entity { Session session = Game.Scene.GetComponent().Get(dbAddress); DBQueryResponse dbQueryResponse = await session.Call(new DBQueryRequest { CollectionName = typeof(T).Name, Id = id, NeedCache = needCache }); - return (T)dbQueryResponse.Entity; + return (T)dbQueryResponse.Disposer; } public async Task> QueryBatch(List ids, bool needCache = true) where T : Entity @@ -62,9 +62,9 @@ namespace Model List list = new List(); Session session = Game.Scene.GetComponent().Get(dbAddress); DBQueryBatchResponse dbQueryBatchResponse = await session.Call(new DBQueryBatchRequest { CollectionName = typeof(T).Name, IdList = ids, NeedCache = needCache}); - foreach (Entity entity in dbQueryBatchResponse.Entitys) + foreach (Disposer disposer in dbQueryBatchResponse.Disposers) { - list.Add((T)entity); + list.Add((T)disposer); } return list; } @@ -74,9 +74,9 @@ namespace Model List list = new List(); Session session = Game.Scene.GetComponent().Get(dbAddress); DBQueryJsonResponse dbQueryJsonResponse = await session.Call(new DBQueryJsonRequest { CollectionName = typeof(T).Name, Json = json, NeedCache = needCache}); - foreach (Entity entity in dbQueryJsonResponse.Entitys) + foreach (Disposer disposer in dbQueryJsonResponse.Disposers) { - list.Add((T)entity); + list.Add((T)disposer); } return list; } diff --git a/Server/Model/Entity/DBQueryBatchTask.cs b/Server/Model/Entity/DBQueryBatchTask.cs index 2a52c624..97e595ce 100644 --- a/Server/Model/Entity/DBQueryBatchTask.cs +++ b/Server/Model/Entity/DBQueryBatchTask.cs @@ -7,9 +7,9 @@ using MongoDB.Driver; namespace Model { [ObjectEvent] - public class DBQueryBatchTaskEvent : ObjectEvent, IAwake, string, TaskCompletionSource>> + public class DBQueryBatchTaskEvent : ObjectEvent, IAwake, string, TaskCompletionSource>> { - public void Awake(List idList, string collectionName, TaskCompletionSource> tcs) + public void Awake(List idList, string collectionName, TaskCompletionSource> tcs) { DBQueryBatchTask self = this.Get(); @@ -25,31 +25,31 @@ namespace Model public List IdList { get; set; } - public TaskCompletionSource> Tcs { get; set; } + public TaskCompletionSource> Tcs { get; set; } public override async Task Run() { DBCacheComponent dbCacheComponent = Game.Scene.GetComponent(); DBComponent dbComponent = Game.Scene.GetComponent(); - List result = new List(); + List result = new List(); try { // 执行查询数据库任务 foreach (long id in IdList) { - Entity entity = dbCacheComponent.GetFromCache(this.CollectionName, id); - if (entity == null) + Disposer disposer = dbCacheComponent.GetFromCache(this.CollectionName, id); + if (disposer == null) { - entity = await dbComponent.GetCollection(this.CollectionName).FindAsync((s) => s.Id == id).Result.FirstOrDefaultAsync(); - dbCacheComponent.AddToCache(entity); + disposer = await dbComponent.GetCollection(this.CollectionName).FindAsync((s) => s.Id == id).Result.FirstOrDefaultAsync(); + dbCacheComponent.AddToCache(disposer); } - if (entity == null) + if (disposer == null) { continue; } - result.Add(entity); + result.Add(disposer); } this.Tcs.SetResult(result); diff --git a/Server/Model/Entity/DBQueryTask.cs b/Server/Model/Entity/DBQueryTask.cs index bb719d13..ac65a423 100644 --- a/Server/Model/Entity/DBQueryTask.cs +++ b/Server/Model/Entity/DBQueryTask.cs @@ -5,9 +5,9 @@ using MongoDB.Driver; namespace Model { [ObjectEvent] - public class DBQueryTaskEvent : ObjectEvent, IAwake> + public class DBQueryTaskEvent : ObjectEvent, IAwake> { - public void Awake(string collectionName, TaskCompletionSource tcs) + public void Awake(string collectionName, TaskCompletionSource tcs) { DBQueryTask self = this.Get(); self.CollectionName = collectionName; @@ -19,7 +19,7 @@ namespace Model { public string CollectionName { get; set; } - public TaskCompletionSource Tcs { get; set; } + public TaskCompletionSource Tcs { get; set; } public DBQueryTask(long id): base(id) { @@ -30,21 +30,21 @@ namespace Model DBCacheComponent dbCacheComponent = Game.Scene.GetComponent(); DBComponent dbComponent = Game.Scene.GetComponent(); // 执行查询前先看看cache中是否已经存在 - Entity entity = dbCacheComponent.GetFromCache(this.CollectionName, this.Id); - if (entity != null) + Disposer disposer = dbCacheComponent.GetFromCache(this.CollectionName, this.Id); + if (disposer != null) { - this.Tcs.SetResult(entity); + this.Tcs.SetResult(disposer); return; } try { // 执行查询数据库任务 - entity = await dbComponent.GetCollection(this.CollectionName).FindAsync((s) => s.Id == this.Id).Result.FirstOrDefaultAsync(); - if (entity != null) + disposer = await dbComponent.GetCollection(this.CollectionName).FindAsync((s) => s.Id == this.Id).Result.FirstOrDefaultAsync(); + if (disposer != null) { - dbCacheComponent.AddToCache(entity); + dbCacheComponent.AddToCache(disposer); } - this.Tcs.SetResult(entity); + this.Tcs.SetResult(disposer); } catch (Exception e) { diff --git a/Server/Model/Entity/Message/InnerMessage.cs b/Server/Model/Entity/Message/InnerMessage.cs index bb3c6913..716082f5 100644 --- a/Server/Model/Entity/Message/InnerMessage.cs +++ b/Server/Model/Entity/Message/InnerMessage.cs @@ -1,4 +1,4 @@ using System.Collections.Generic; using MongoDB.Bson.Serialization.Attributes; // 服务器内部消息 Opcode从10000开始 namespace Model { public abstract partial class AMessage { } public abstract partial class ARequest : AMessage { } public abstract partial class AResponse : AMessage { } public abstract partial class AActorMessage : AMessage { } public abstract partial class AActorRequest : ARequest { } public abstract partial class AActorResponse : AResponse { } - /// /// 用来包装actor消息 /// [Message(Opcode.ActorRequest)] [BsonIgnoreExtraElements] public class ActorRequest : ARequest { public long Id { get; set; } public AMessage AMessage { get; set; } } /// /// actor RPC消息响应 /// [Message(Opcode.ActorResponse)] [BsonIgnoreExtraElements] public class ActorResponse : AResponse { } /// /// 用来包装actor消息 /// [Message(Opcode.ActorRpcRequest)] [BsonIgnoreExtraElements] public class ActorRpcRequest : ActorRequest { } /// /// actor RPC消息响应带回应 /// [Message(Opcode.ActorRpcResponse)] [BsonIgnoreExtraElements] public class ActorRpcResponse : ActorResponse { public AMessage AMessage { get; set; } } /// /// 传送unit /// [Message(Opcode.M2M_TrasferUnitRequest)] [BsonIgnoreExtraElements] public class M2M_TrasferUnitRequest : ARequest { public Unit Unit; } [Message(Opcode.M2M_TrasferUnitResponse)] [BsonIgnoreExtraElements] public class M2M_TrasferUnitResponse : AResponse { } [Message(Opcode.M2A_Reload)] [BsonIgnoreExtraElements] public class M2A_Reload : ARequest { } [Message(Opcode.A2M_Reload)] [BsonIgnoreExtraElements] public class A2M_Reload : AResponse { } [Message(Opcode.G2G_LockRequest)] [BsonIgnoreExtraElements] public class G2G_LockRequest : ARequest { public long Id; public string Address; } [Message(Opcode.G2G_LockResponse)] [BsonIgnoreExtraElements] public class G2G_LockResponse : AResponse { } [Message(Opcode.G2G_LockReleaseRequest)] [BsonIgnoreExtraElements] public class G2G_LockReleaseRequest : ARequest { public long Id; public string Address; } [Message(Opcode.G2G_LockReleaseResponse)] [BsonIgnoreExtraElements] public class G2G_LockReleaseResponse : AResponse { } [Message(Opcode.DBSaveRequest)] [BsonIgnoreExtraElements] public class DBSaveRequest : ARequest { public bool NeedCache = true; public string CollectionName = ""; public Entity Entity; } [Message(Opcode.DBSaveBatchResponse)] [BsonIgnoreExtraElements] public class DBSaveBatchResponse : AResponse { } [Message(Opcode.DBSaveBatchRequest)] [BsonIgnoreExtraElements] public class DBSaveBatchRequest : ARequest { public bool NeedCache = true; public string CollectionName = ""; public List Entitys = new List(); } [Message(Opcode.DBSaveResponse)] [BsonIgnoreExtraElements] public class DBSaveResponse : AResponse { } [Message(Opcode.DBQueryRequest)] [BsonIgnoreExtraElements] public class DBQueryRequest : ARequest { public long Id; public string CollectionName { get; set; } public bool NeedCache = true; } [Message(Opcode.DBQueryResponse)] [BsonIgnoreExtraElements] public class DBQueryResponse : AResponse { public Entity Entity; } [Message(Opcode.DBQueryBatchRequest)] [BsonIgnoreExtraElements] public class DBQueryBatchRequest : ARequest { public string CollectionName { get; set; } public List IdList { get; set; } public bool NeedCache = true; } [Message(Opcode.DBQueryBatchResponse)] [BsonIgnoreExtraElements] public class DBQueryBatchResponse : AResponse { public List Entitys; } [Message(Opcode.DBQueryJsonRequest)] [BsonIgnoreExtraElements] public class DBQueryJsonRequest : ARequest { public string CollectionName { get; set; } public string Json { get; set; } public bool NeedCache = true; } [Message(Opcode.DBQueryJsonResponse)] [BsonIgnoreExtraElements] public class DBQueryJsonResponse : AResponse { public List Entitys; } [Message(Opcode.ObjectAddRequest)] [BsonIgnoreExtraElements] public class ObjectAddRequest : ARequest { public long Key { get; set; } public int AppId { get; set; } } [Message(Opcode.ObjectAddResponse)] [BsonIgnoreExtraElements] public class ObjectAddResponse : AResponse { } [Message(Opcode.ObjectRemoveRequest)] [BsonIgnoreExtraElements] public class ObjectRemoveRequest : ARequest { public long Key { get; set; } } [Message(Opcode.ObjectRemoveResponse)] [BsonIgnoreExtraElements] public class ObjectRemoveResponse : AResponse { } [Message(Opcode.ObjectLockRequest)] [BsonIgnoreExtraElements] public class ObjectLockRequest : ARequest { public long Key { get; set; } public int LockAppId { get; set; } public int Time { get; set; } } [Message(Opcode.ObjectLockResponse)] [BsonIgnoreExtraElements] public class ObjectLockResponse : AResponse { } [Message(Opcode.ObjectUnLockRequest)] [BsonIgnoreExtraElements] public class ObjectUnLockRequest : ARequest { public long Key { get; set; } public int UnLockAppId { get; set; } public int AppId { get; set; } } [Message(Opcode.ObjectUnLockResponse)] [BsonIgnoreExtraElements] public class ObjectUnLockResponse : AResponse { } [Message(Opcode.ObjectGetRequest)] [BsonIgnoreExtraElements] public class ObjectGetRequest : ARequest { public long Key { get; set; } } [Message(Opcode.ObjectGetResponse)] [BsonIgnoreExtraElements] public class ObjectGetResponse : AResponse { public int AppId { get; set; } } [Message(Opcode.R2G_GetLoginKey)] [BsonIgnoreExtraElements] public class R2G_GetLoginKey : ARequest { public string Account; } [Message(Opcode.G2R_GetLoginKey)] [BsonIgnoreExtraElements] public class G2R_GetLoginKey : AResponse { public long Key; public G2R_GetLoginKey() { } public G2R_GetLoginKey(long key) { this.Key = key; } } [Message(Opcode.G2M_CreateUnit)] [BsonIgnoreExtraElements] public class G2M_CreateUnit : ARequest { public long PlayerId; public long GateSessionId; } [Message(Opcode.M2G_CreateUnit)] [BsonIgnoreExtraElements] public class M2G_CreateUnit : AResponse { public long UnitId; public int Count; } } \ No newline at end of file + /// /// 用来包装actor消息 /// [Message(Opcode.ActorRequest)] [BsonIgnoreExtraElements] public class ActorRequest : ARequest { public long Id { get; set; } public AMessage AMessage { get; set; } } /// /// actor RPC消息响应 /// [Message(Opcode.ActorResponse)] [BsonIgnoreExtraElements] public class ActorResponse : AResponse { } /// /// 用来包装actor消息 /// [Message(Opcode.ActorRpcRequest)] [BsonIgnoreExtraElements] public class ActorRpcRequest : ActorRequest { } /// /// actor RPC消息响应带回应 /// [Message(Opcode.ActorRpcResponse)] [BsonIgnoreExtraElements] public class ActorRpcResponse : ActorResponse { public AMessage AMessage { get; set; } } /// /// 传送unit /// [Message(Opcode.M2M_TrasferUnitRequest)] [BsonIgnoreExtraElements] public class M2M_TrasferUnitRequest : ARequest { public Unit Unit; } [Message(Opcode.M2M_TrasferUnitResponse)] [BsonIgnoreExtraElements] public class M2M_TrasferUnitResponse : AResponse { } [Message(Opcode.M2A_Reload)] [BsonIgnoreExtraElements] public class M2A_Reload : ARequest { } [Message(Opcode.A2M_Reload)] [BsonIgnoreExtraElements] public class A2M_Reload : AResponse { } [Message(Opcode.G2G_LockRequest)] [BsonIgnoreExtraElements] public class G2G_LockRequest : ARequest { public long Id; public string Address; } [Message(Opcode.G2G_LockResponse)] [BsonIgnoreExtraElements] public class G2G_LockResponse : AResponse { } [Message(Opcode.G2G_LockReleaseRequest)] [BsonIgnoreExtraElements] public class G2G_LockReleaseRequest : ARequest { public long Id; public string Address; } [Message(Opcode.G2G_LockReleaseResponse)] [BsonIgnoreExtraElements] public class G2G_LockReleaseResponse : AResponse { } [Message(Opcode.DBSaveRequest)] [BsonIgnoreExtraElements] public class DBSaveRequest : ARequest { public bool NeedCache = true; public string CollectionName = ""; public Disposer Disposer; } [Message(Opcode.DBSaveBatchResponse)] [BsonIgnoreExtraElements] public class DBSaveBatchResponse : AResponse { } [Message(Opcode.DBSaveBatchRequest)] [BsonIgnoreExtraElements] public class DBSaveBatchRequest : ARequest { public bool NeedCache = true; public string CollectionName = ""; public List Disposers = new List(); } [Message(Opcode.DBSaveResponse)] [BsonIgnoreExtraElements] public class DBSaveResponse : AResponse { } [Message(Opcode.DBQueryRequest)] [BsonIgnoreExtraElements] public class DBQueryRequest : ARequest { public long Id; public string CollectionName { get; set; } public bool NeedCache = true; } [Message(Opcode.DBQueryResponse)] [BsonIgnoreExtraElements] public class DBQueryResponse : AResponse { public Disposer Disposer; } [Message(Opcode.DBQueryBatchRequest)] [BsonIgnoreExtraElements] public class DBQueryBatchRequest : ARequest { public string CollectionName { get; set; } public List IdList { get; set; } public bool NeedCache = true; } [Message(Opcode.DBQueryBatchResponse)] [BsonIgnoreExtraElements] public class DBQueryBatchResponse : AResponse { public List Disposers; } [Message(Opcode.DBQueryJsonRequest)] [BsonIgnoreExtraElements] public class DBQueryJsonRequest : ARequest { public string CollectionName { get; set; } public string Json { get; set; } public bool NeedCache = true; } [Message(Opcode.DBQueryJsonResponse)] [BsonIgnoreExtraElements] public class DBQueryJsonResponse : AResponse { public List Disposers; } [Message(Opcode.ObjectAddRequest)] [BsonIgnoreExtraElements] public class ObjectAddRequest : ARequest { public long Key { get; set; } public int AppId { get; set; } } [Message(Opcode.ObjectAddResponse)] [BsonIgnoreExtraElements] public class ObjectAddResponse : AResponse { } [Message(Opcode.ObjectRemoveRequest)] [BsonIgnoreExtraElements] public class ObjectRemoveRequest : ARequest { public long Key { get; set; } } [Message(Opcode.ObjectRemoveResponse)] [BsonIgnoreExtraElements] public class ObjectRemoveResponse : AResponse { } [Message(Opcode.ObjectLockRequest)] [BsonIgnoreExtraElements] public class ObjectLockRequest : ARequest { public long Key { get; set; } public int LockAppId { get; set; } public int Time { get; set; } } [Message(Opcode.ObjectLockResponse)] [BsonIgnoreExtraElements] public class ObjectLockResponse : AResponse { } [Message(Opcode.ObjectUnLockRequest)] [BsonIgnoreExtraElements] public class ObjectUnLockRequest : ARequest { public long Key { get; set; } public int UnLockAppId { get; set; } public int AppId { get; set; } } [Message(Opcode.ObjectUnLockResponse)] [BsonIgnoreExtraElements] public class ObjectUnLockResponse : AResponse { } [Message(Opcode.ObjectGetRequest)] [BsonIgnoreExtraElements] public class ObjectGetRequest : ARequest { public long Key { get; set; } } [Message(Opcode.ObjectGetResponse)] [BsonIgnoreExtraElements] public class ObjectGetResponse : AResponse { public int AppId { get; set; } } [Message(Opcode.R2G_GetLoginKey)] [BsonIgnoreExtraElements] public class R2G_GetLoginKey : ARequest { public string Account; } [Message(Opcode.G2R_GetLoginKey)] [BsonIgnoreExtraElements] public class G2R_GetLoginKey : AResponse { public long Key; public G2R_GetLoginKey() { } public G2R_GetLoginKey(long key) { this.Key = key; } } [Message(Opcode.G2M_CreateUnit)] [BsonIgnoreExtraElements] public class G2M_CreateUnit : ARequest { public long PlayerId; public long GateSessionId; } [Message(Opcode.M2G_CreateUnit)] [BsonIgnoreExtraElements] public class M2G_CreateUnit : AResponse { public long UnitId; public int Count; } } \ No newline at end of file diff --git a/Unity/Assets/Scripts/Base/MultiMap.cs b/Unity/Assets/Scripts/Base/MultiMap.cs index 270d1353..245a8e7a 100644 --- a/Unity/Assets/Scripts/Base/MultiMap.cs +++ b/Unity/Assets/Scripts/Base/MultiMap.cs @@ -6,6 +6,9 @@ namespace Model { private readonly SortedDictionary> dictionary = new SortedDictionary>(); + // 重用list + private readonly Queue> queue = new Queue>(); + public SortedDictionary>.KeyCollection Keys { get @@ -20,12 +23,34 @@ namespace Model this.dictionary.TryGetValue(t, out list); if (list == null) { - list = new List(); + list = this.FetchList(); } list.Add(k); this.dictionary[t] = list; } + private List FetchList() + { + if (this.queue.Count > 0) + { + List list = this.queue.Dequeue(); + list.Clear(); + return list; + } + return new List(); + } + + private void RecycleList(List list) + { + // 防止暴涨 + if (this.queue.Count > 100) + { + return; + } + list.Clear(); + this.queue.Enqueue(list); + } + public bool Remove(T t, K k) { List list; @@ -40,6 +65,7 @@ namespace Model } if (list.Count == 0) { + this.RecycleList(list); this.dictionary.Remove(t); } return true; @@ -47,6 +73,12 @@ namespace Model public bool Remove(T t) { + List list = null; + this.dictionary.TryGetValue(t, out list); + if (list != null) + { + this.RecycleList(list); + } return this.dictionary.Remove(t); } @@ -85,7 +117,7 @@ namespace Model { List list; this.dictionary.TryGetValue(t, out list); - if ((list != null) && (list.Count > 0)) + if (list != null && list.Count > 0) { return list[0]; } diff --git a/Unity/Assets/Scripts/Base/Object/Disposer.cs b/Unity/Assets/Scripts/Base/Object/Disposer.cs index a0e4c23e..8ccf073e 100644 --- a/Unity/Assets/Scripts/Base/Object/Disposer.cs +++ b/Unity/Assets/Scripts/Base/Object/Disposer.cs @@ -3,6 +3,8 @@ using MongoDB.Bson.Serialization.Attributes; namespace Model { + [BsonKnownTypes(typeof(Entity))] + [BsonKnownTypes(typeof(Component))] public abstract class Disposer : Object, IDisposable { [BsonIgnoreIfDefault] @@ -10,6 +12,9 @@ namespace Model [BsonElement] [BsonId] public long Id { get; set; } + + [BsonIgnore] + public bool IsFromPool { get; set; } protected Disposer() { @@ -26,7 +31,10 @@ namespace Model public virtual void Dispose() { this.Id = 0; - ObjectPool.Instance.Recycle(this); + if (this.IsFromPool) + { + ObjectPool.Instance.Recycle(this); + } } } } \ No newline at end of file diff --git a/Unity/Assets/Scripts/Base/Object/EntityFactory.cs b/Unity/Assets/Scripts/Base/Object/EntityFactory.cs index 9e34963e..02f84c63 100644 --- a/Unity/Assets/Scripts/Base/Object/EntityFactory.cs +++ b/Unity/Assets/Scripts/Base/Object/EntityFactory.cs @@ -1,6 +1,4 @@ -using System; - -namespace Model +namespace Model { public static class EntityFactory { diff --git a/Unity/Assets/Scripts/Base/Object/ObjectPool.cs b/Unity/Assets/Scripts/Base/Object/ObjectPool.cs index cad59aa8..9cc4caee 100644 --- a/Unity/Assets/Scripts/Base/Object/ObjectPool.cs +++ b/Unity/Assets/Scripts/Base/Object/ObjectPool.cs @@ -47,8 +47,10 @@ namespace Model public T Fetch() where T: Disposer { - return (T) this.Fetch(typeof(T)); - } + T t = (T) this.Fetch(typeof(T)); + t.IsFromPool = true; + return t; + } public void Recycle(Disposer obj) { diff --git a/Unity/Assets/Scripts/Component/NetworkComponent.cs b/Unity/Assets/Scripts/Component/NetworkComponent.cs index 24705450..a1bc1750 100644 --- a/Unity/Assets/Scripts/Component/NetworkComponent.cs +++ b/Unity/Assets/Scripts/Component/NetworkComponent.cs @@ -79,7 +79,7 @@ namespace Model public virtual async Task Accept() { AChannel channel = await this.Service.AcceptChannel(); - Session session = new Session(this, channel); + Session session = EntityFactory.Create(this, channel); channel.ErrorCallback += (c, e) => { this.Remove(session.Id); }; this.sessions.Add(session.Id, session); return session; @@ -111,7 +111,7 @@ namespace Model try { AChannel channel = this.Service.ConnectChannel(ipEndPoint); - Session session = new Session(this, channel); + Session session = EntityFactory.Create(this, channel); channel.ErrorCallback += (c, e) => { this.Remove(session.Id); }; this.sessions.Add(session.Id, session); return session; diff --git a/Unity/Assets/Scripts/Entity/Session.cs b/Unity/Assets/Scripts/Entity/Session.cs index 7f3bc29a..90b43215 100644 --- a/Unity/Assets/Scripts/Entity/Session.cs +++ b/Unity/Assets/Scripts/Entity/Session.cs @@ -6,22 +6,57 @@ using System.Threading.Tasks; namespace Model { + [ObjectEvent] + public class SessionEvent : ObjectEvent, IAwake, IStart + { + public void Awake(NetworkComponent network, AChannel channel) + { + this.Get().Awake(network, channel); + } + + public void Start() + { + this.Get().Start(); + } + } + public sealed class Session : Entity { private static uint RpcId { get; set; } - private readonly NetworkComponent network; + private NetworkComponent network; + private AChannel channel; + private readonly Dictionary> requestCallback = new Dictionary>(); - private readonly AChannel channel; private readonly List byteses = new List() {new byte[0], new byte[0]}; - public Session(NetworkComponent network, AChannel channel) + public void Awake(NetworkComponent net, AChannel c) + { + this.network = net; + this.channel = c; + this.requestCallback.Clear(); + } + + public void Start() { - this.network = network; - this.channel = channel; - this.StartRecv(); } + public override void Dispose() + { + if (this.Id == 0) + { + return; + } + + long id = this.Id; + + base.Dispose(); + + this.channel.Dispose(); + this.network.Remove(id); + this.requestCallback.Clear(); + } + public IPEndPoint RemoteAddress { get @@ -318,20 +353,5 @@ namespace Model channel.Send(this.byteses); } - - public override void Dispose() - { - if (this.Id == 0) - { - return; - } - - long id = this.Id; - - base.Dispose(); - - this.channel.Dispose(); - this.network.Remove(id); - } } } \ No newline at end of file -- GitLab