diff --git a/Server/Hotfix/Handler/DBQueryBatchRequestHandler.cs b/Server/Hotfix/Handler/DBQueryBatchRequestHandler.cs index 6c1aba2c942fc30f4ecb433bf23256e70f1cb6f4..42b9450216774cd1579f64bb20a2cb7eb4ee30a3 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 d4dfb1b921207454892ad35153eb91f594d46ae2..3dacaf77e84e287ca89dadc315302a90b5d1c40b 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 dd8567c7c5b097fa23bf2ed8db1afb9a68278d96..d8ce22732af2213fd0f1b44e9cc7e99eb17b07bd 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 7de35a10b07e4653ac3a76261c663c6533f15671..e5ea1c93c4c27615a8e2721ba8fd1bc824fcfcd3 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 7ba8b264c9d0f5aca0b14d8a6749b29040060eaf..e8c1e37e49c0ee9a0826f1db9925eec0e1ac3671 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 ca009ff6a0d7ec3df95bd80fb5f2bad0d390bb91..0fdd4e306fd4840624a4b5aa6ae2029f2172b133 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 b59a9f75ce5badbb40b7bad5112a098e4874a6f1..3b5ec453a6292d8b4bc17f5f34bc29f7f57f3eea 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 2a52c6248a5c6041ce8305860aa2470fe6ffe3af..97e595ce0cb60028cac5b53ae4b969850d9523ef 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 bb719d13615eefa2db2da1a6cfefec3a1a462953..ac65a423ef3abc6ccd8ba2ce24f5a4e004eecc78 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 bb3c691398192b4139a2208d949b0addb5bf75a7..716082f548a800fcb85b7a0e605b8038d9ab32b9 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 270d1353cf5dd06f2f8d9586a53a853974e549f2..245a8e7ac2687c1c328e8d8a7fa32d8adafbc336 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 a0e4c23e6eb4faef9a105bd740cabca37f5186d8..8ccf073ee781145b25df7af46f8463560cef2421 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 9e34963e62d53e0ccae414bc8228c643d931c19f..02f84c633d6d1abd76cebb6d206188bfd21b3bf7 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 cad59aa867d5aba22ea597e6eb3c13d922e6b94f..9cc4caee3b268f8ec5fc77c65d79ca408beaa88c 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 24705450b9339374461aa141b21a8a010eec690b..a1bc175072c0c0f6db1e29da8148d6d35830ca7a 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 7f3bc29a56468cdc5a506e8e30ddfbfb9a6bd459..90b43215ba7536b033505baa6c8687041e602ff7 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