fix: Replaces throttlers and packet callbacks with function pointers (#1063)

Replaces multi-cast delegates with function pointers to gain 25% in performance and lower allocations.
This commit is contained in:
Stefano Merotta 2022-06-15 21:48:43 +02:00 • committed by GitHub
parent b779d7737f
commit f24b98f8e2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
31 changed files with 189 additions and 172 deletions

View file

@ -38,21 +38,21 @@ public static class IncomingAccountPackets
}
}
public static void Configure()
public static unsafe void Configure()
{
IncomingPackets.Register(0x00, 104, false, CreateCharacter);
IncomingPackets.Register(0x5D, 73, false, PlayCharacter);
IncomingPackets.Register(0x80, 62, false, AccountLogin);
IncomingPackets.Register(0x83, 39, false, DeleteCharacter);
IncomingPackets.Register(0x91, 65, false, GameLogin);
IncomingPackets.Register(0xA0, 3, false, PlayServer);
IncomingPackets.Register(0xBB, 9, false, AccountID);
IncomingPackets.Register(0xBD, 0, false, ClientVersion);
IncomingPackets.Register(0xBE, 0, true, AssistVersion);
IncomingPackets.Register(0xCF, 0, false, AccountLogin);
IncomingPackets.Register(0xE1, 0, false, ClientType);
IncomingPackets.Register(0xEF, 21, false, LoginServerSeed);
IncomingPackets.Register(0xF8, 106, false, CreateCharacter);
IncomingPackets.Register(0x00, 104, false, &CreateCharacter);
IncomingPackets.Register(0x5D, 73, false, &PlayCharacter);
IncomingPackets.Register(0x80, 62, false, &AccountLogin);
IncomingPackets.Register(0x83, 39, false, &DeleteCharacter);
IncomingPackets.Register(0x91, 65, false, &GameLogin);
IncomingPackets.Register(0xA0, 3, false, &PlayServer);
IncomingPackets.Register(0xBB, 9, false, &AccountID);
IncomingPackets.Register(0xBD, 0, false, &ClientVersion);
IncomingPackets.Register(0xBE, 0, true, &AssistVersion);
IncomingPackets.Register(0xCF, 0, false, &AccountLogin);
IncomingPackets.Register(0xE1, 0, false, &ClientType);
IncomingPackets.Register(0xEF, 21, false, &LoginServerSeed);
IncomingPackets.Register(0xF8, 106, false, &CreateCharacter);
}
public static void CreateCharacter(NetState state, CircularBufferReader reader, int packetLength)

View file

@ -19,12 +19,12 @@ public static class IncomingEntityPackets
{
public static bool SingleClickProps { get; set; }
public static void Configure()
public static unsafe void Configure()
{
IncomingPackets.Register(0x06, 5, true, UseReq);
IncomingPackets.Register(0x09, 5, true, LookReq);
IncomingPackets.Register(0xB6, 9, true, ObjectHelpRequest);
IncomingPackets.Register(0xD6, 0, true, BatchQueryProperties);
IncomingPackets.Register(0x06, 5, true, &UseReq);
IncomingPackets.Register(0x09, 5, true, &LookReq);
IncomingPackets.Register(0xB6, 9, true, &ObjectHelpRequest);
IncomingPackets.Register(0xD6, 0, true, &BatchQueryProperties);
}
public static void ObjectHelpRequest(NetState state, CircularBufferReader reader, int packetLength)

View file

@ -34,29 +34,29 @@ public static class IncomingExtendedCommandPackets
125, 126, 127, 128
};
public static void Configure()
public static unsafe void Configure()
{
IncomingPackets.Register(0xBF, 0, true, ExtendedCommand);
IncomingPackets.Register(0xBF, 0, true, &ExtendedCommand);
RegisterExtended(0x05, false, ScreenSize);
RegisterExtended(0x06, true, PartyMessage);
RegisterExtended(0x09, true, DisarmRequest);
RegisterExtended(0x0A, true, StunRequest);
RegisterExtended(0x0B, false, Language);
RegisterExtended(0x0C, true, CloseStatus);
RegisterExtended(0x0E, true, Animate);
RegisterExtended(0x0F, false, Empty); // What's this?
RegisterExtended(0x10, true, QueryProperties);
RegisterExtended(0x13, true, ContextMenuRequest);
RegisterExtended(0x15, true, ContextMenuResponse);
RegisterExtended(0x1A, true, StatLockChange);
RegisterExtended(0x1C, true, CastSpell);
RegisterExtended(0x24, false, UnhandledBF);
RegisterExtended(0x2C, true, BandageTarget);
RegisterExtended(0x2D, true, TargetedSpell);
RegisterExtended(0x2E, true, TargetedSkillUse);
RegisterExtended(0x30, true, TargetByResourceMacro);
RegisterExtended(0x32, true, ToggleFlying);
RegisterExtended(0x05, false, &ScreenSize);
RegisterExtended(0x06, true, &PartyMessage);
RegisterExtended(0x09, true, &DisarmRequest);
RegisterExtended(0x0A, true, &StunRequest);
RegisterExtended(0x0B, false, &Language);
RegisterExtended(0x0C, true, &CloseStatus);
RegisterExtended(0x0E, true, &Animate);
RegisterExtended(0x0F, false, &Empty); // What's this?
RegisterExtended(0x10, true, &QueryProperties);
RegisterExtended(0x13, true, &ContextMenuRequest);
RegisterExtended(0x15, true, &ContextMenuResponse);
RegisterExtended(0x1A, true, &StatLockChange);
RegisterExtended(0x1C, true, &CastSpell);
RegisterExtended(0x24, false, &UnhandledBF);
RegisterExtended(0x2C, true, &BandageTarget);
RegisterExtended(0x2D, true, &TargetedSpell);
RegisterExtended(0x2E, true, &TargetedSkillUse);
RegisterExtended(0x30, true, &TargetByResourceMacro);
RegisterExtended(0x32, true, &ToggleFlying);
}
private static void UnhandledBF(NetState state, CircularBufferReader reader, int packetLength)
@ -67,7 +67,8 @@ public static class IncomingExtendedCommandPackets
{
}
public static void RegisterExtended(int packetID, bool ingame, OnPacketReceive onReceive)
public static unsafe void RegisterExtended(int packetID, bool ingame,
delegate*<NetState, CircularBufferReader, int, void> onReceive)
{
if (packetID is >= 0 and < 0x100)
{
@ -86,7 +87,7 @@ public static class IncomingExtendedCommandPackets
}
}
public static void ExtendedCommand(NetState state, CircularBufferReader reader, int packetLength)
public static unsafe void ExtendedCommand(NetState state, CircularBufferReader reader, int packetLength)
{
int packetId = reader.ReadUInt16();

View file

@ -17,9 +17,9 @@ namespace Server.Network;
public static class IncomingHousePackets
{
public static void Configure()
public static unsafe void Configure()
{
IncomingPackets.Register(0xFB, 2, false, ShowPublicHouseContent);
IncomingPackets.Register(0xFB, 2, false, &ShowPublicHouseContent);
}
public static void ShowPublicHouseContent(NetState state, CircularBufferReader reader, int packetLength)

View file

@ -21,13 +21,13 @@ namespace Server.Network;
public static class IncomingItemPackets
{
public static void Configure()
public static unsafe void Configure()
{
IncomingPackets.Register(0x07, 7, true, LiftReq);
IncomingPackets.Register(new ContainerGridPacketHandler(0x08, 14, true, DropReq));
IncomingPackets.Register(0x13, 10, true, EquipReq);
IncomingPackets.Register(0xEC, 0, false, EquipMacro);
IncomingPackets.Register(0xED, 0, false, UnequipMacro);
IncomingPackets.Register(0x07, 7, true, &LiftReq);
IncomingPackets.Register(new ContainerGridPacketHandler(0x08, 14, true, &DropReq));
IncomingPackets.Register(0x13, 10, true, &EquipReq);
IncomingPackets.Register(0xEC, 0, false, &EquipMacro);
IncomingPackets.Register(0xED, 0, false, &UnequipMacro);
}
public static void LiftReq(NetState state, CircularBufferReader reader, int packetLength)

View file

@ -40,10 +40,10 @@ public static class IncomingMessagePackets
{
private static readonly KeywordList m_KeywordList = new();
public static void Configure()
public static unsafe void Configure()
{
IncomingPackets.Register(0x03, 0, true, AsciiSpeech);
IncomingPackets.Register(0xAD, 0, true, UnicodeSpeech);
IncomingPackets.Register(0x03, 0, true, &AsciiSpeech);
IncomingPackets.Register(0xAD, 0, true, &UnicodeSpeech);
}
public static void AsciiSpeech(NetState state, CircularBufferReader reader, int packetLength)

View file

@ -19,12 +19,12 @@ namespace Server.Network;
public static class IncomingMobilePackets
{
public static void Configure()
public static unsafe void Configure()
{
IncomingPackets.Register(0x75, 35, true, RenameRequest);
IncomingPackets.Register(0x98, 0, true, MobileNameRequest);
IncomingPackets.Register(0xB8, 0, true, ProfileReq);
IncomingPackets.Register(0x6F, 0, true, SecureTrade);
IncomingPackets.Register(0x75, 35, true, &RenameRequest);
IncomingPackets.Register(0x98, 0, true, &MobileNameRequest);
IncomingPackets.Register(0xB8, 0, true, &ProfileReq);
IncomingPackets.Register(0x6F, 0, true, &SecureTrade);
}
public static void RenameRequest(NetState state, CircularBufferReader reader, int packetLength)

View file

@ -17,9 +17,9 @@ namespace Server.Network;
public static class IncomingMovementPackets
{
public static void Configure()
public static unsafe void Configure()
{
IncomingPackets.Register(0x02, 7, true, MovementReq);
IncomingPackets.Register(0x02, 7, true, &MovementReq);
// Not used by OSI, and interferes with ClassicUO/Razor protocol extensions
// IncomingPackets.Register(0xF0, 0, true, NewMovementReq);
// IncomingPackets.Register(0xF1, 9, true, TimeSyncReq);

View file

@ -24,7 +24,8 @@ public static class IncomingPackets
public static PacketHandler[] Handlers { get; } = new PacketHandler[0x100];
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Register(int packetID, int length, bool ingame, OnPacketReceive onReceive) =>
public static unsafe void Register(int packetID, int length, bool ingame,
delegate*<NetState, CircularBufferReader, int, void> onReceive) =>
Register(new PacketHandler(packetID, length, ingame, onReceive));
public static void Register(PacketHandler packetHandler)
@ -53,7 +54,7 @@ public static class IncomingPackets
}
}
public static void RegisterThrottler(int packetID, ThrottlePacketCallback t)
public static unsafe void RegisterThrottler(int packetID, delegate*<int, NetState, out bool, bool> t)
{
var ph = GetHandler(packetID);

View file

@ -23,30 +23,30 @@ namespace Server.Network;
public static class IncomingPlayerPackets
{
public static void Configure()
public static unsafe void Configure()
{
IncomingPackets.Register(0x01, 5, false, Disconnect);
IncomingPackets.Register(0x05, 5, true, AttackReq);
IncomingPackets.Register(0x12, 0, true, TextCommand);
IncomingPackets.Register(0x22, 3, true, Resynchronize);
IncomingPackets.Register(0x2C, 2, true, DeathStatusResponse);
IncomingPackets.Register(0x34, 10, true, MobileQuery);
IncomingPackets.Register(0x3A, 0, true, ChangeSkillLock);
IncomingPackets.Register(0x72, 5, true, SetWarMode);
IncomingPackets.Register(0x73, 2, false, PingReq);
IncomingPackets.Register(0x7D, 13, true, MenuResponse);
IncomingPackets.Register(0x95, 9, true, HuePickerResponse);
IncomingPackets.Register(0x9A, 0, true, AsciiPromptResponse);
IncomingPackets.Register(0x9B, 258, true, HelpRequest);
IncomingPackets.Register(0xA4, 149, false, SystemInfo);
IncomingPackets.Register(0xA7, 4, true, RequestScrollWindow);
IncomingPackets.Register(0xB1, 0, true, DisplayGumpResponse);
IncomingPackets.Register(0xC2, 0, true, UnicodePromptResponse);
IncomingPackets.Register(0xC8, 2, true, SetUpdateRange);
IncomingPackets.Register(0xD0, 0, true, ConfigurationFile);
IncomingPackets.Register(0xD1, 2, true, LogoutReq);
IncomingPackets.Register(0xD7, 0, true, EncodedCommand);
IncomingPackets.Register(0xF4, 0, false, CrashReport);
IncomingPackets.Register(0x01, 5, false, &Disconnect);
IncomingPackets.Register(0x05, 5, true, &AttackReq);
IncomingPackets.Register(0x12, 0, true, &TextCommand);
IncomingPackets.Register(0x22, 3, true, &Resynchronize);
IncomingPackets.Register(0x2C, 2, true, &DeathStatusResponse);
IncomingPackets.Register(0x34, 10, true, &MobileQuery);
IncomingPackets.Register(0x3A, 0, true, &ChangeSkillLock);
IncomingPackets.Register(0x72, 5, true, &SetWarMode);
IncomingPackets.Register(0x73, 2, false, &PingReq);
IncomingPackets.Register(0x7D, 13, true, &MenuResponse);
IncomingPackets.Register(0x95, 9, true, &HuePickerResponse);
IncomingPackets.Register(0x9A, 0, true, &AsciiPromptResponse);
IncomingPackets.Register(0x9B, 258, true, &HelpRequest);
IncomingPackets.Register(0xA4, 149, false, &SystemInfo);
IncomingPackets.Register(0xA7, 4, true, &RequestScrollWindow);
IncomingPackets.Register(0xB1, 0, true, &DisplayGumpResponse);
IncomingPackets.Register(0xC2, 0, true, &UnicodePromptResponse);
IncomingPackets.Register(0xC8, 2, true, &SetUpdateRange);
IncomingPackets.Register(0xD0, 0, true, &ConfigurationFile);
IncomingPackets.Register(0xD1, 2, true, &LogoutReq);
IncomingPackets.Register(0xD7, 0, true, &EncodedCommand);
IncomingPackets.Register(0xF4, 0, false, &CrashReport);
IncomingPackets.RegisterEncoded(0x28, true, GuildGumpRequest);
IncomingPackets.RegisterEncoded(0x32, true, QuestGumpRequest);

View file

@ -20,9 +20,9 @@ namespace Server.Network;
public static class IncomingTargetingPackets
{
public static void Configure()
public static unsafe void Configure()
{
IncomingPackets.Register(0x6C, 19, true, TargetResponse);
IncomingPackets.Register(0x6C, 19, true, &TargetResponse);
}
public static void TargetResponse(NetState state, CircularBufferReader reader, int packetLength)

View file

@ -19,10 +19,10 @@ namespace Server.Network;
public static class IncomingVendorPackets
{
public static void Configure()
public static unsafe void Configure()
{
IncomingPackets.Register(0x3B, 0, true, VendorBuyReply);
IncomingPackets.Register(0x9F, 0, true, VendorSellReply);
IncomingPackets.Register(0x3B, 0, true, &VendorBuyReply);
IncomingPackets.Register(0x9F, 0, true, &VendorSellReply);
}
public static void VendorBuyReply(NetState state, CircularBufferReader reader, int packetLength)