提交 68c2f85b 编写于 作者: T tanghai

1.数据库操作可以操作component

2.对象池,不从池中取就不应该回收到池
3.优化MultiMap,减少gc
上级 fc8f1052
...@@ -13,15 +13,15 @@ namespace Hotfix ...@@ -13,15 +13,15 @@ namespace Hotfix
try try
{ {
DBCacheComponent dbCacheComponent = Game.Scene.GetComponent<DBCacheComponent>(); DBCacheComponent dbCacheComponent = Game.Scene.GetComponent<DBCacheComponent>();
List<Entity> entitys = await dbCacheComponent.GetBatch(message.CollectionName, message.IdList); List<Disposer> disposers = await dbCacheComponent.GetBatch(message.CollectionName, message.IdList);
response.Entitys = entitys; response.Disposers = disposers;
if (message.NeedCache) if (message.NeedCache)
{ {
foreach (Entity entity in entitys) foreach (Disposer disposer in disposers)
{ {
dbCacheComponent.AddToCache(entity, message.CollectionName); dbCacheComponent.AddToCache(disposer, message.CollectionName);
} }
} }
......
...@@ -13,15 +13,15 @@ namespace Hotfix ...@@ -13,15 +13,15 @@ namespace Hotfix
try try
{ {
DBCacheComponent dbCacheComponent = Game.Scene.GetComponent<DBCacheComponent>(); DBCacheComponent dbCacheComponent = Game.Scene.GetComponent<DBCacheComponent>();
List<Entity> entitys = await dbCacheComponent.GetJson(message.CollectionName, message.Json); List<Disposer> disposers = await dbCacheComponent.GetJson(message.CollectionName, message.Json);
response.Entitys = entitys; response.Disposers = disposers;
if (message.NeedCache) if (message.NeedCache)
{ {
foreach (Entity entity in entitys) foreach (Disposer disposer in disposers)
{ {
dbCacheComponent.AddToCache(entity, message.CollectionName); dbCacheComponent.AddToCache(disposer, message.CollectionName);
} }
} }
......
...@@ -12,13 +12,13 @@ namespace Hotfix ...@@ -12,13 +12,13 @@ namespace Hotfix
try try
{ {
DBCacheComponent dbCacheComponent = Game.Scene.GetComponent<DBCacheComponent>(); DBCacheComponent dbCacheComponent = Game.Scene.GetComponent<DBCacheComponent>();
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); reply(response);
......
...@@ -15,18 +15,18 @@ namespace Hotfix ...@@ -15,18 +15,18 @@ namespace Hotfix
if (message.CollectionName == "") if (message.CollectionName == "")
{ {
message.CollectionName = message.Entitys[0].GetType().Name; message.CollectionName = message.Disposers[0].GetType().Name;
} }
if (message.NeedCache) 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); reply(response);
} }
......
...@@ -14,14 +14,14 @@ namespace Hotfix ...@@ -14,14 +14,14 @@ namespace Hotfix
DBCacheComponent dbCacheComponent = Game.Scene.GetComponent<DBCacheComponent>(); DBCacheComponent dbCacheComponent = Game.Scene.GetComponent<DBCacheComponent>();
if (message.CollectionName == "") if (message.CollectionName == "")
{ {
message.CollectionName = message.Entity.GetType().Name; message.CollectionName = message.Disposer.GetType().Name;
} }
if (message.NeedCache) 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); reply(response);
} }
catch (Exception e) catch (Exception e)
......
...@@ -17,7 +17,7 @@ namespace Model ...@@ -17,7 +17,7 @@ namespace Model
/// </summary> /// </summary>
public class DBCacheComponent : Component public class DBCacheComponent : Component
{ {
public Dictionary<string, Dictionary<long, Entity>> cache = new Dictionary<string, Dictionary<long, Entity>>(); public Dictionary<string, Dictionary<long, Disposer>> cache = new Dictionary<string, Dictionary<long, Disposer>>();
public const int taskCount = 32; public const int taskCount = 32;
public List<DBTaskQueue> tasks = new List<DBTaskQueue>(taskCount); public List<DBTaskQueue> tasks = new List<DBTaskQueue>(taskCount);
...@@ -31,53 +31,53 @@ namespace Model ...@@ -31,53 +31,53 @@ namespace Model
} }
} }
public Task<bool> Add(Entity entity, string collectionName = "") public Task<bool> Add(Disposer disposer, string collectionName = "")
{ {
TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>(); TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
this.AddToCache(entity, collectionName); this.AddToCache(disposer, collectionName);
if (collectionName == "") if (collectionName == "")
{ {
collectionName = entity.GetType().Name; collectionName = disposer.GetType().Name;
} }
DBSaveTask task = EntityFactory.CreateWithId<DBSaveTask, Entity, string, TaskCompletionSource<bool>>(entity.Id, entity, collectionName, tcs); DBSaveTask task = EntityFactory.CreateWithId<DBSaveTask, Disposer, string, TaskCompletionSource<bool>>(disposer.Id, disposer, collectionName, tcs);
this.tasks[(int)((ulong)task.Id % taskCount)].Add(task); this.tasks[(int)((ulong)task.Id % taskCount)].Add(task);
return tcs.Task; return tcs.Task;
} }
public Task<bool> AddBatch(List<Entity> entitys, string collectionName) public Task<bool> AddBatch(List<Disposer> disposers, string collectionName)
{ {
TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>(); TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
DBSaveBatchTask task = EntityFactory.Create<DBSaveBatchTask, List<Entity>, string, TaskCompletionSource<bool>>(entitys, collectionName, tcs); DBSaveBatchTask task = EntityFactory.Create<DBSaveBatchTask, List<Disposer>, string, TaskCompletionSource<bool>>(disposers, collectionName, tcs);
this.tasks[(int)((ulong)task.Id % taskCount)].Add(task); this.tasks[(int)((ulong)task.Id % taskCount)].Add(task);
return tcs.Task; return tcs.Task;
} }
public void AddToCache(Entity entity, string collectionName = "") public void AddToCache(Disposer disposer, string collectionName = "")
{ {
if (collectionName == "") if (collectionName == "")
{ {
collectionName = entity.GetType().Name; collectionName = disposer.GetType().Name;
} }
Dictionary<long, Entity> collection; Dictionary<long, Disposer> collection;
if (!this.cache.TryGetValue(collectionName, out collection)) if (!this.cache.TryGetValue(collectionName, out collection))
{ {
collection = new Dictionary<long, Entity>(); collection = new Dictionary<long, Disposer>();
this.cache.Add(collectionName, collection); 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<long, Entity> d; Dictionary<long, Disposer> d;
if (!this.cache.TryGetValue(collectionName, out d)) if (!this.cache.TryGetValue(collectionName, out d))
{ {
return null; return null;
} }
Entity result; Disposer result;
if (!d.TryGetValue(id, out result)) if (!d.TryGetValue(id, out result))
{ {
return null; return null;
...@@ -87,7 +87,7 @@ namespace Model ...@@ -87,7 +87,7 @@ namespace Model
public void RemoveFromCache(string collectionName, long id) public void RemoveFromCache(string collectionName, long id)
{ {
Dictionary<long, Entity> d; Dictionary<long, Disposer> d;
if (!this.cache.TryGetValue(collectionName, out d)) if (!this.cache.TryGetValue(collectionName, out d))
{ {
return; return;
...@@ -95,53 +95,53 @@ namespace Model ...@@ -95,53 +95,53 @@ namespace Model
d.Remove(id); d.Remove(id);
} }
public Task<Entity> Get(string collectionName, long id) public Task<Disposer> Get(string collectionName, long id)
{ {
Entity entity = GetFromCache(collectionName, id); Disposer entity = GetFromCache(collectionName, id);
if (entity != null) if (entity != null)
{ {
return Task.FromResult(entity); return Task.FromResult(entity);
} }
TaskCompletionSource<Entity> tcs = new TaskCompletionSource<Entity>(); TaskCompletionSource<Disposer> tcs = new TaskCompletionSource<Disposer>();
DBQueryTask dbQueryTask = EntityFactory.CreateWithId<DBQueryTask, string, TaskCompletionSource<Entity>>(id, collectionName, tcs); DBQueryTask dbQueryTask = EntityFactory.CreateWithId<DBQueryTask, string, TaskCompletionSource<Disposer>>(id, collectionName, tcs);
this.tasks[(int)((ulong)id % taskCount)].Add(dbQueryTask); this.tasks[(int)((ulong)id % taskCount)].Add(dbQueryTask);
return tcs.Task; return tcs.Task;
} }
public Task<List<Entity>> GetBatch(string collectionName, List<long> idList) public Task<List<Disposer>> GetBatch(string collectionName, List<long> idList)
{ {
List <Entity> entitys = new List<Entity>(); List <Disposer> disposers = new List<Disposer>();
bool isAllInCache = true; bool isAllInCache = true;
foreach (long id in idList) foreach (long id in idList)
{ {
Entity entity = this.GetFromCache(collectionName, id); Disposer entity = this.GetFromCache(collectionName, id);
if (entity == null) if (entity == null)
{ {
isAllInCache = false; isAllInCache = false;
break; break;
} }
entitys.Add(entity); disposers.Add(entity);
} }
if (isAllInCache) if (isAllInCache)
{ {
return Task.FromResult(entitys); return Task.FromResult(disposers);
} }
TaskCompletionSource<List<Entity>> tcs = new TaskCompletionSource<List<Entity>>(); TaskCompletionSource<List<Disposer>> tcs = new TaskCompletionSource<List<Disposer>>();
DBQueryBatchTask dbQueryBatchTask = EntityFactory.Create<DBQueryBatchTask, List<long>, string, TaskCompletionSource<List<Entity>>>(idList, collectionName, tcs); DBQueryBatchTask dbQueryBatchTask = EntityFactory.Create<DBQueryBatchTask, List<long>, string, TaskCompletionSource<List<Disposer>>>(idList, collectionName, tcs);
this.tasks[(int)((ulong)dbQueryBatchTask.Id % taskCount)].Add(dbQueryBatchTask); this.tasks[(int)((ulong)dbQueryBatchTask.Id % taskCount)].Add(dbQueryBatchTask);
return tcs.Task; return tcs.Task;
} }
public Task<List<Entity>> GetJson(string collectionName, string json) public Task<List<Disposer>> GetJson(string collectionName, string json)
{ {
TaskCompletionSource<List<Entity>> tcs = new TaskCompletionSource<List<Entity>>(); TaskCompletionSource<List<Disposer>> tcs = new TaskCompletionSource<List<Disposer>>();
DBQueryJsonTask dbQueryJsonTask = EntityFactory.Create<DBQueryJsonTask, string, string, TaskCompletionSource< List < Entity >>>(collectionName, json, tcs); DBQueryJsonTask dbQueryJsonTask = EntityFactory.Create<DBQueryJsonTask, string, string, TaskCompletionSource<List<Disposer>>>(collectionName, json, tcs);
this.tasks[(int)((ulong)dbQueryJsonTask.Id % taskCount)].Add(dbQueryJsonTask); this.tasks[(int)((ulong)dbQueryJsonTask.Id % taskCount)].Add(dbQueryJsonTask);
return tcs.Task; return tcs.Task;
......
...@@ -26,35 +26,35 @@ namespace Model ...@@ -26,35 +26,35 @@ namespace Model
dbAddress = dbStartConfig.GetComponent<InnerConfig>().Address; dbAddress = dbStartConfig.GetComponent<InnerConfig>().Address;
} }
public async Task Save(Entity entity, bool needCache = true) public async Task Save(Disposer disposer, bool needCache = true)
{ {
Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(dbAddress); Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(dbAddress);
await session.Call<DBSaveResponse>(new DBSaveRequest { Entity = entity, NeedCache = needCache}); await session.Call<DBSaveResponse>(new DBSaveRequest { Disposer = disposer, NeedCache = needCache});
} }
public async Task SaveBatch(List<Entity> entitys, bool needCache = true) public async Task SaveBatch(List<Disposer> disposers, bool needCache = true)
{ {
Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(dbAddress); Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(dbAddress);
await session.Call<DBSaveBatchResponse>(new DBSaveBatchRequest { Entitys = entitys, NeedCache = needCache}); await session.Call<DBSaveBatchResponse>(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<NetInnerComponent>().Get(dbAddress); Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(dbAddress);
await session.Call<DBSaveResponse>(new DBSaveRequest { Entity = entity, NeedCache = needCache}, cancellationToken); await session.Call<DBSaveResponse>(new DBSaveRequest { Disposer = disposer, NeedCache = needCache}, cancellationToken);
} }
public async void SaveLog(Entity entity) public async void SaveLog(Disposer disposer)
{ {
Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(dbAddress); Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(dbAddress);
await session.Call<DBSaveResponse>(new DBSaveRequest { Entity = entity, NeedCache = false, CollectionName = "Log" }); await session.Call<DBSaveResponse>(new DBSaveRequest { Disposer = disposer, NeedCache = false, CollectionName = "Log" });
} }
public async Task<T> Query<T>(long id, bool needCache = true) where T: Entity public async Task<T> Query<T>(long id, bool needCache = true) where T: Entity
{ {
Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(dbAddress); Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(dbAddress);
DBQueryResponse dbQueryResponse = await session.Call<DBQueryResponse>(new DBQueryRequest { CollectionName = typeof(T).Name, Id = id, NeedCache = needCache }); DBQueryResponse dbQueryResponse = await session.Call<DBQueryResponse>(new DBQueryRequest { CollectionName = typeof(T).Name, Id = id, NeedCache = needCache });
return (T)dbQueryResponse.Entity; return (T)dbQueryResponse.Disposer;
} }
public async Task<List<T>> QueryBatch<T>(List<long> ids, bool needCache = true) where T : Entity public async Task<List<T>> QueryBatch<T>(List<long> ids, bool needCache = true) where T : Entity
...@@ -62,9 +62,9 @@ namespace Model ...@@ -62,9 +62,9 @@ namespace Model
List<T> list = new List<T>(); List<T> list = new List<T>();
Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(dbAddress); Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(dbAddress);
DBQueryBatchResponse dbQueryBatchResponse = await session.Call<DBQueryBatchResponse>(new DBQueryBatchRequest { CollectionName = typeof(T).Name, IdList = ids, NeedCache = needCache}); DBQueryBatchResponse dbQueryBatchResponse = await session.Call<DBQueryBatchResponse>(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; return list;
} }
...@@ -74,9 +74,9 @@ namespace Model ...@@ -74,9 +74,9 @@ namespace Model
List<T> list = new List<T>(); List<T> list = new List<T>();
Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(dbAddress); Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(dbAddress);
DBQueryJsonResponse dbQueryJsonResponse = await session.Call<DBQueryJsonResponse>(new DBQueryJsonRequest { CollectionName = typeof(T).Name, Json = json, NeedCache = needCache}); DBQueryJsonResponse dbQueryJsonResponse = await session.Call<DBQueryJsonResponse>(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; return list;
} }
......
...@@ -7,9 +7,9 @@ using MongoDB.Driver; ...@@ -7,9 +7,9 @@ using MongoDB.Driver;
namespace Model namespace Model
{ {
[ObjectEvent] [ObjectEvent]
public class DBQueryBatchTaskEvent : ObjectEvent<DBQueryBatchTask>, IAwake<List<long>, string, TaskCompletionSource<List<Entity>>> public class DBQueryBatchTaskEvent : ObjectEvent<DBQueryBatchTask>, IAwake<List<long>, string, TaskCompletionSource<List<Disposer>>>
{ {
public void Awake(List<long> idList, string collectionName, TaskCompletionSource<List<Entity>> tcs) public void Awake(List<long> idList, string collectionName, TaskCompletionSource<List<Disposer>> tcs)
{ {
DBQueryBatchTask self = this.Get(); DBQueryBatchTask self = this.Get();
...@@ -25,31 +25,31 @@ namespace Model ...@@ -25,31 +25,31 @@ namespace Model
public List<long> IdList { get; set; } public List<long> IdList { get; set; }
public TaskCompletionSource<List<Entity>> Tcs { get; set; } public TaskCompletionSource<List<Disposer>> Tcs { get; set; }
public override async Task Run() public override async Task Run()
{ {
DBCacheComponent dbCacheComponent = Game.Scene.GetComponent<DBCacheComponent>(); DBCacheComponent dbCacheComponent = Game.Scene.GetComponent<DBCacheComponent>();
DBComponent dbComponent = Game.Scene.GetComponent<DBComponent>(); DBComponent dbComponent = Game.Scene.GetComponent<DBComponent>();
List<Entity> result = new List<Entity>(); List<Disposer> result = new List<Disposer>();
try try
{ {
// 执行查询数据库任务 // 执行查询数据库任务
foreach (long id in IdList) foreach (long id in IdList)
{ {
Entity entity = dbCacheComponent.GetFromCache(this.CollectionName, id); Disposer disposer = dbCacheComponent.GetFromCache(this.CollectionName, id);
if (entity == null) if (disposer == null)
{ {
entity = await dbComponent.GetCollection(this.CollectionName).FindAsync((s) => s.Id == id).Result.FirstOrDefaultAsync(); disposer = await dbComponent.GetCollection(this.CollectionName).FindAsync((s) => s.Id == id).Result.FirstOrDefaultAsync();
dbCacheComponent.AddToCache(entity); dbCacheComponent.AddToCache(disposer);
} }
if (entity == null) if (disposer == null)
{ {
continue; continue;
} }
result.Add(entity); result.Add(disposer);
} }
this.Tcs.SetResult(result); this.Tcs.SetResult(result);
......
...@@ -5,9 +5,9 @@ using MongoDB.Driver; ...@@ -5,9 +5,9 @@ using MongoDB.Driver;
namespace Model namespace Model
{ {
[ObjectEvent] [ObjectEvent]
public class DBQueryTaskEvent : ObjectEvent<DBQueryTask>, IAwake<string, TaskCompletionSource<Entity>> public class DBQueryTaskEvent : ObjectEvent<DBQueryTask>, IAwake<string, TaskCompletionSource<Disposer>>
{ {
public void Awake(string collectionName, TaskCompletionSource<Entity> tcs) public void Awake(string collectionName, TaskCompletionSource<Disposer> tcs)
{ {
DBQueryTask self = this.Get(); DBQueryTask self = this.Get();
self.CollectionName = collectionName; self.CollectionName = collectionName;
...@@ -19,7 +19,7 @@ namespace Model ...@@ -19,7 +19,7 @@ namespace Model
{ {
public string CollectionName { get; set; } public string CollectionName { get; set; }
public TaskCompletionSource<Entity> Tcs { get; set; } public TaskCompletionSource<Disposer> Tcs { get; set; }
public DBQueryTask(long id): base(id) public DBQueryTask(long id): base(id)
{ {
...@@ -30,21 +30,21 @@ namespace Model ...@@ -30,21 +30,21 @@ namespace Model
DBCacheComponent dbCacheComponent = Game.Scene.GetComponent<DBCacheComponent>(); DBCacheComponent dbCacheComponent = Game.Scene.GetComponent<DBCacheComponent>();
DBComponent dbComponent = Game.Scene.GetComponent<DBComponent>(); DBComponent dbComponent = Game.Scene.GetComponent<DBComponent>();
// 执行查询前先看看cache中是否已经存在 // 执行查询前先看看cache中是否已经存在
Entity entity = dbCacheComponent.GetFromCache(this.CollectionName, this.Id); Disposer disposer = dbCacheComponent.GetFromCache(this.CollectionName, this.Id);
if (entity != null) if (disposer != null)
{ {
this.Tcs.SetResult(entity); this.Tcs.SetResult(disposer);
return; return;
} }
try try
{ {
// 执行查询数据库任务 // 执行查询数据库任务
entity = await dbComponent.GetCollection(this.CollectionName).FindAsync((s) => s.Id == this.Id).Result.FirstOrDefaultAsync(); disposer = await dbComponent.GetCollection(this.CollectionName).FindAsync((s) => s.Id == this.Id).Result.FirstOrDefaultAsync();
if (entity != null) if (disposer != null)
{ {
dbCacheComponent.AddToCache(entity); dbCacheComponent.AddToCache(disposer);
} }
this.Tcs.SetResult(entity); this.Tcs.SetResult(disposer);
} }
catch (Exception e) catch (Exception e)
{ {
......
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 { } 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 { }
/// <summary> /// 用来包装actor消息 /// </summary> [Message(Opcode.ActorRequest)] [BsonIgnoreExtraElements] public class ActorRequest : ARequest { public long Id { get; set; } public AMessage AMessage { get; set; } } /// <summary> /// actor RPC消息响应 /// </summary> [Message(Opcode.ActorResponse)] [BsonIgnoreExtraElements] public class ActorResponse : AResponse { } /// <summary> /// 用来包装actor消息 /// </summary> [Message(Opcode.ActorRpcRequest)] [BsonIgnoreExtraElements] public class ActorRpcRequest : ActorRequest { } /// <summary> /// actor RPC消息响应带回应 /// </summary> [Message(Opcode.ActorRpcResponse)] [BsonIgnoreExtraElements] public class ActorRpcResponse : ActorResponse { public AMessage AMessage { get; set; } } /// <summary> /// 传送unit /// </summary> [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<Entity> Entitys = new List<Entity>(); } [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<long> IdList { get; set; } public bool NeedCache = true; } [Message(Opcode.DBQueryBatchResponse)] [BsonIgnoreExtraElements] public class DBQueryBatchResponse : AResponse { public List<Entity> 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<Entity> 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; } } /// <summary> /// 用来包装actor消息 /// </summary> [Message(Opcode.ActorRequest)] [BsonIgnoreExtraElements] public class ActorRequest : ARequest { public long Id { get; set; } public AMessage AMessage { get; set; } } /// <summary> /// actor RPC消息响应 /// </summary> [Message(Opcode.ActorResponse)] [BsonIgnoreExtraElements] public class ActorResponse : AResponse { } /// <summary> /// 用来包装actor消息 /// </summary> [Message(Opcode.ActorRpcRequest)] [BsonIgnoreExtraElements] public class ActorRpcRequest : ActorRequest { } /// <summary> /// actor RPC消息响应带回应 /// </summary> [Message(Opcode.ActorRpcResponse)] [BsonIgnoreExtraElements] public class ActorRpcResponse : ActorResponse { public AMessage AMessage { get; set; } } /// <summary> /// 传送unit /// </summary> [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<Disposer> Disposers = new List<Disposer>(); } [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<long> IdList { get; set; } public bool NeedCache = true; } [Message(Opcode.DBQueryBatchResponse)] [BsonIgnoreExtraElements] public class DBQueryBatchResponse : AResponse { public List<Disposer> 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<Disposer> 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 \ No newline at end of file
......
...@@ -6,6 +6,9 @@ namespace Model ...@@ -6,6 +6,9 @@ namespace Model
{ {
private readonly SortedDictionary<T, List<K>> dictionary = new SortedDictionary<T, List<K>>(); private readonly SortedDictionary<T, List<K>> dictionary = new SortedDictionary<T, List<K>>();
// 重用list
private readonly Queue<List<K>> queue = new Queue<List<K>>();
public SortedDictionary<T, List<K>>.KeyCollection Keys public SortedDictionary<T, List<K>>.KeyCollection Keys
{ {
get get
...@@ -20,12 +23,34 @@ namespace Model ...@@ -20,12 +23,34 @@ namespace Model
this.dictionary.TryGetValue(t, out list); this.dictionary.TryGetValue(t, out list);
if (list == null) if (list == null)
{ {
list = new List<K>(); list = this.FetchList();
} }
list.Add(k); list.Add(k);
this.dictionary[t] = list; this.dictionary[t] = list;
} }
private List<K> FetchList()
{
if (this.queue.Count > 0)
{
List<K> list = this.queue.Dequeue();
list.Clear();
return list;
}
return new List<K>();
}
private void RecycleList(List<K> list)
{
// 防止暴涨
if (this.queue.Count > 100)
{
return;
}
list.Clear();
this.queue.Enqueue(list);
}
public bool Remove(T t, K k) public bool Remove(T t, K k)
{ {
List<K> list; List<K> list;
...@@ -40,6 +65,7 @@ namespace Model ...@@ -40,6 +65,7 @@ namespace Model
} }
if (list.Count == 0) if (list.Count == 0)
{ {
this.RecycleList(list);
this.dictionary.Remove(t); this.dictionary.Remove(t);
} }
return true; return true;
...@@ -47,6 +73,12 @@ namespace Model ...@@ -47,6 +73,12 @@ namespace Model
public bool Remove(T t) public bool Remove(T t)
{ {
List<K> list = null;
this.dictionary.TryGetValue(t, out list);
if (list != null)
{
this.RecycleList(list);
}
return this.dictionary.Remove(t); return this.dictionary.Remove(t);
} }
...@@ -85,7 +117,7 @@ namespace Model ...@@ -85,7 +117,7 @@ namespace Model
{ {
List<K> list; List<K> list;
this.dictionary.TryGetValue(t, out list); this.dictionary.TryGetValue(t, out list);
if ((list != null) && (list.Count > 0)) if (list != null && list.Count > 0)
{ {
return list[0]; return list[0];
} }
......
...@@ -3,6 +3,8 @@ using MongoDB.Bson.Serialization.Attributes; ...@@ -3,6 +3,8 @@ using MongoDB.Bson.Serialization.Attributes;
namespace Model namespace Model
{ {
[BsonKnownTypes(typeof(Entity))]
[BsonKnownTypes(typeof(Component))]
public abstract class Disposer : Object, IDisposable public abstract class Disposer : Object, IDisposable
{ {
[BsonIgnoreIfDefault] [BsonIgnoreIfDefault]
...@@ -10,6 +12,9 @@ namespace Model ...@@ -10,6 +12,9 @@ namespace Model
[BsonElement] [BsonElement]
[BsonId] [BsonId]
public long Id { get; set; } public long Id { get; set; }
[BsonIgnore]
public bool IsFromPool { get; set; }
protected Disposer() protected Disposer()
{ {
...@@ -26,7 +31,10 @@ namespace Model ...@@ -26,7 +31,10 @@ namespace Model
public virtual void Dispose() public virtual void Dispose()
{ {
this.Id = 0; this.Id = 0;
ObjectPool.Instance.Recycle(this); if (this.IsFromPool)
{
ObjectPool.Instance.Recycle(this);
}
} }
} }
} }
\ No newline at end of file
using System; namespace Model
namespace Model
{ {
public static class EntityFactory public static class EntityFactory
{ {
......
...@@ -47,8 +47,10 @@ namespace Model ...@@ -47,8 +47,10 @@ namespace Model
public T Fetch<T>() where T: Disposer public T Fetch<T>() 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) public void Recycle(Disposer obj)
{ {
......
...@@ -79,7 +79,7 @@ namespace Model ...@@ -79,7 +79,7 @@ namespace Model
public virtual async Task<Session> Accept() public virtual async Task<Session> Accept()
{ {
AChannel channel = await this.Service.AcceptChannel(); AChannel channel = await this.Service.AcceptChannel();
Session session = new Session(this, channel); Session session = EntityFactory.Create<Session, NetworkComponent, AChannel>(this, channel);
channel.ErrorCallback += (c, e) => { this.Remove(session.Id); }; channel.ErrorCallback += (c, e) => { this.Remove(session.Id); };
this.sessions.Add(session.Id, session); this.sessions.Add(session.Id, session);
return session; return session;
...@@ -111,7 +111,7 @@ namespace Model ...@@ -111,7 +111,7 @@ namespace Model
try try
{ {
AChannel channel = this.Service.ConnectChannel(ipEndPoint); AChannel channel = this.Service.ConnectChannel(ipEndPoint);
Session session = new Session(this, channel); Session session = EntityFactory.Create<Session, NetworkComponent, AChannel>(this, channel);
channel.ErrorCallback += (c, e) => { this.Remove(session.Id); }; channel.ErrorCallback += (c, e) => { this.Remove(session.Id); };
this.sessions.Add(session.Id, session); this.sessions.Add(session.Id, session);
return session; return session;
......
...@@ -6,22 +6,57 @@ using System.Threading.Tasks; ...@@ -6,22 +6,57 @@ using System.Threading.Tasks;
namespace Model namespace Model
{ {
[ObjectEvent]
public class SessionEvent : ObjectEvent<Session>, IAwake<NetworkComponent, AChannel>, IStart
{
public void Awake(NetworkComponent network, AChannel channel)
{
this.Get().Awake(network, channel);
}
public void Start()
{
this.Get().Start();
}
}
public sealed class Session : Entity public sealed class Session : Entity
{ {
private static uint RpcId { get; set; } private static uint RpcId { get; set; }
private readonly NetworkComponent network; private NetworkComponent network;
private AChannel channel;
private readonly Dictionary<uint, Action<object>> requestCallback = new Dictionary<uint, Action<object>>(); private readonly Dictionary<uint, Action<object>> requestCallback = new Dictionary<uint, Action<object>>();
private readonly AChannel channel;
private readonly List<byte[]> byteses = new List<byte[]>() {new byte[0], new byte[0]}; private readonly List<byte[]> byteses = new List<byte[]>() {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(); 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 public IPEndPoint RemoteAddress
{ {
get get
...@@ -318,20 +353,5 @@ namespace Model ...@@ -318,20 +353,5 @@ namespace Model
channel.Send(this.byteses); 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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册