Better Performance in I/O

This commit is contained in:
StopWuyu
2024-10-19 22:02:20 +08:00
parent 8f80a95bce
commit dd3a7bbed2
8 changed files with 131 additions and 17 deletions

View File

@@ -224,7 +224,7 @@ public class PlayerInstance(PlayerData data)
await QuestManager!.AcceptQuestByCondition();
}
public T InitializeDatabase<T>() where T : class, new()
public T InitializeDatabase<T>() where T : BaseDatabaseDataHelper, new()
{
var instance = DatabaseHelper.Instance?.GetInstanceOrCreateNew<T>(Uid);
return instance!;

View File

@@ -1,10 +1,14 @@
using System.Buffers;
using System.Net;
using System.Reflection;
using EggLink.DanhengServer.GameServer.Game.Player;
using EggLink.DanhengServer.GameServer.Server.Packet;
using EggLink.DanhengServer.Kcp;
using EggLink.DanhengServer.Kcp.KcpSharp;
using EggLink.DanhengServer.Proto;
using EggLink.DanhengServer.Util;
using Google.Protobuf;
using Google.Protobuf.Reflection;
namespace EggLink.DanhengServer.GameServer.Server;
@@ -140,7 +144,57 @@ public class Connection(KcpConversation conversation, IPEndPoint remote) : Danhe
break;
}
await handler.OnHandle(this, header, payload);
try
{
await handler.OnHandle(this, header, payload);
}
catch
{
// get the packet rsp and set retCode to Retcode.RetFail
var curPacket = LogMap.GetValueOrDefault(opcode);
if (curPacket == null) return;
var rspName = curPacket.Replace("Cs", "Sc").Replace("Req", "Rsp"); // Get the response packet name
if (rspName == curPacket) return; // do not send rsp when resp name = recv name
var rspOpcode = LogMap.FirstOrDefault(x => x.Value == rspName).Key; // Get the response opcode
// get proto class
var typ = AppDomain.CurrentDomain.GetAssemblies()
.SingleOrDefault(assembly => assembly.GetName().Name == "DanhengProto")!.GetTypes()
.First(t => t.Name == rspName); //get the type using the packet name
var curTyp = AppDomain.CurrentDomain.GetAssemblies()
.SingleOrDefault(assembly => assembly.GetName().Name == "DanhengProto")!.GetTypes()
.First(t => t.Name == curPacket); //get the type using the packet name
// create the response packet
if (Activator.CreateInstance(typ) is not IMessage rsp) return;
// set the retCode to Retcode.RetFail
var retCode = typ.GetProperty("Retcode");
retCode?.SetValue(rsp, (uint)Retcode.RetFail);
// get the same field in req and rsp
var descriptor =
curTyp.GetProperty("Descriptor", BindingFlags.Public | BindingFlags.Static)?.GetValue(
null, null) as MessageDescriptor; // get the static property Descriptor
var reqPacket = descriptor?.Parser.ParseFrom(payload);
foreach (var propertyInfo in curTyp.GetProperties())
{
var prop = typ.GetProperty(propertyInfo.Name);
if (prop != null && prop.CanWrite)
{
var value = propertyInfo.GetValue(reqPacket);
if (value != null)
prop.SetValue(rsp, value);
}
}
// send the response packet
var packet = new BasePacket((ushort)rspOpcode);
packet.SetData(rsp);
await SendPacket(packet);
}
return;
}

View File

@@ -10,9 +10,9 @@ public class HandlerEnterSceneCsReq : Handler
public override async Task OnHandle(Connection connection, byte[] header, byte[] data)
{
var req = EnterSceneCsReq.Parser.ParseFrom(data);
var overMapTp = await connection.Player!.EnterScene((int)req.EntryId, (int)req.TeleportId, true,
(int)req.GameStoryLineId, req.IsCloseMap);
var overMapTp = await connection.Player!.EnterScene((int)req.EntryId, (int)req.TeleportId, true,
(int)req.GameStoryLineId, req.IsCloseMap);
await connection.SendPacket(new PacketEnterSceneScRsp(overMapTp, req.IsCloseMap, (int)req.GameStoryLineId));
await connection.SendPacket(new PacketEnterSceneScRsp(overMapTp, req.IsCloseMap, (int)req.GameStoryLineId));
}
}

View File

@@ -15,6 +15,16 @@ public class PacketEnterSceneScRsp : BasePacket
IsOverMap = overMapTp
};
SetData(proto);
}
public PacketEnterSceneScRsp(Retcode retcode) : base(
CmdIds.EnterSceneScRsp)
{
var proto = new EnterSceneScRsp
{
Retcode = (uint)retcode
};
SetData(proto);
}
}