fix(core): Adds SkipLocalsInitAttribute support, optimizes broadcasted packets (#363)

- [X] Adds support for `SkipLocalsInitAttribute`. SkipLocalsInitAttribute skips initializing stack variables including `stackalloc`. I don't think it is wired/working yet but should be implemented soon.
- [X] Optimizes broadcasted packets by checking if the first byte (packet ID) is non-zero. If it is already set, it reuses the buffer.
- [X] Removes unnecessary refs to Spans. I don't think the Span struct itself is mutable, so a ref is not helpful.
This commit is contained in:
Kamron Batman 2020-12-26 12:46:06 -08:00 committed by GitHub
parent 9c9591b098
commit 03d0a4664e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
25 changed files with 478 additions and 285 deletions

View file

@ -33,12 +33,12 @@ namespace Server.Network
}
Span<byte> buffer = stackalloc byte[SoundPacketLength];
CreateSoundEffect(ref buffer, soundID, target);
CreateSoundEffect(buffer, soundID, target);
ns.Send(buffer);
}
public static void CreateSoundEffect(ref Span<byte> buffer, int soundID, IPoint3D target)
public static void CreateSoundEffect(Span<byte> buffer, int soundID, IPoint3D target)
{
var writer = new SpanWriter(buffer);
writer.Write((byte)0x54); // Packet ID
@ -51,7 +51,7 @@ namespace Server.Network
}
public static void CreateParticleEffect(
ref Span<byte> buffer,
Span<byte> buffer,
EffectType type, Serial from, Serial to, int itemID, IPoint3D fromPoint, IPoint3D toPoint,
int speed, int duration, bool fixedDirection, bool explode, int hue, int renderMode, int effect,
int explodeEffect, int explodeSound, Serial serial, int layer, int unknown
@ -86,10 +86,10 @@ namespace Server.Network
}
public static void CreateTargetParticleEffect(
ref Span<byte> buffer,
Span<byte> buffer,
IEntity e, int itemID, int speed, int duration, int hue, int renderMode, int effect, int layer, int unknown
) => CreateParticleEffect(
ref buffer,
buffer,
EffectType.FixedFrom,
e.Serial,
Serial.Zero,
@ -111,10 +111,10 @@ namespace Server.Network
);
public static void CreateLocationParticleEffect(
ref Span<byte> buffer,
Span<byte> buffer,
IEntity e, int itemID, int speed, int duration, int hue, int renderMode, int effect, int unknown
) => CreateParticleEffect(
ref buffer,
buffer,
EffectType.FixedXYZ,
e.Serial,
Serial.Zero,
@ -136,12 +136,12 @@ namespace Server.Network
);
public static void CreateMovingParticleEffect(
ref Span<byte> buffer,
Span<byte> buffer,
IEntity from, IEntity to, int itemID, int speed, int duration, bool fixedDirection,
bool explodes, int hue, int renderMode, int effect, int explodeEffect, int explodeSound, EffectLayer layer,
int unknown
) => CreateParticleEffect(
ref buffer,
buffer,
EffectType.Moving,
from.Serial,
to.Serial,
@ -163,7 +163,7 @@ namespace Server.Network
);
public static void CreateHuedEffect(
ref Span<byte> buffer,
Span<byte> buffer,
EffectType type, Serial from, Serial to, int itemID, Point3D fromPoint, Point3D toPoint,
int speed, int duration, bool fixedDirection, bool explode, int hue, int renderMode
)
@ -191,10 +191,10 @@ namespace Server.Network
}
public static void CreateTargetHuedEffect(
ref Span<byte> buffer,
Span<byte> buffer,
IEntity e, int itemID, int speed, int duration, int hue, int renderMode
) => CreateHuedEffect(
ref buffer,
buffer,
EffectType.FixedFrom,
e.Serial,
Serial.Zero,
@ -210,10 +210,10 @@ namespace Server.Network
);
public static void CreateLocationHuedEffect(
ref Span<byte> buffer,
Span<byte> buffer,
Point3D p, int itemID, int speed, int duration, int hue, int renderMode
) => CreateHuedEffect(
ref buffer,
buffer,
EffectType.FixedXYZ,
Serial.Zero,
Serial.Zero,
@ -229,11 +229,11 @@ namespace Server.Network
);
public static void CreateMovingHuedEffect(
ref Span<byte> buffer,
Span<byte> buffer,
IEntity from, IEntity to, int itemID, int speed, int duration, bool fixedDirection,
bool explodes, int hue, int renderMode
) => CreateHuedEffect(
ref buffer,
buffer,
EffectType.Moving,
from.Serial,
to.Serial,
@ -249,11 +249,11 @@ namespace Server.Network
);
public static void CreateMovingHuedEffect(
ref Span<byte> buffer,
Span<byte> buffer,
int itemID, Point3D fromLocation, Point3D toLocation, int speed, int duration,
bool fixedDirection, bool explodes, int hue, int renderMode
) => CreateHuedEffect(
ref buffer,
buffer,
EffectType.Moving,
Serial.Zero,
Serial.Zero,
@ -269,11 +269,11 @@ namespace Server.Network
);
public static void CreateMovingHuedEffect(
ref Span<byte> buffer,
Span<byte> buffer,
Serial from, Serial to, int itemID, Point3D fromLocation, Point3D toLocation, int speed, int duration,
bool fixedDirection, bool explodes, int hue, int renderMode
) => CreateHuedEffect(
ref buffer,
buffer,
EffectType.Moving,
from,
to,
@ -288,8 +288,8 @@ namespace Server.Network
renderMode
);
public static void CreateBoltEffect(ref Span<byte> buffer, IEntity target, int hue) => CreateHuedEffect(
ref buffer,
public static void CreateBoltEffect(Span<byte> buffer, IEntity target, int hue) => CreateHuedEffect(
buffer,
EffectType.Lightning,
target.Serial,
Serial.Zero,

View file

@ -23,10 +23,10 @@ namespace Server.Network
public const int OPLPacketLength = 9;
public const int RemoveEntityLength = 5;
public static void CreateOPLInfo(ref Span<byte> buffer, Item item) =>
CreateOPLInfo(ref buffer, item.Serial, item.PropertyList.Hash);
public static void CreateOPLInfo(Span<byte> buffer, Item item) =>
CreateOPLInfo(buffer, item.Serial, item.PropertyList.Hash);
public static void CreateOPLInfo(ref Span<byte> buffer, Serial serial, int hash)
public static void CreateOPLInfo(Span<byte> buffer, Serial serial, int hash)
{
var writer = new SpanWriter(buffer);
writer.Write((byte)0xDC); // Packet ID
@ -45,12 +45,12 @@ namespace Server.Network
}
Span<byte> buffer = stackalloc byte[OPLPacketLength];
CreateOPLInfo(ref buffer, serial, hash);
CreateOPLInfo(buffer, serial, hash);
ns.Send(buffer);
}
public static void CreateRemoveEntity(ref Span<byte> buffer, Serial serial)
public static void CreateRemoveEntity(Span<byte> buffer, Serial serial)
{
var writer = new SpanWriter(buffer);
writer.Write((byte)0x1D); // Packet ID
@ -65,7 +65,7 @@ namespace Server.Network
}
Span<byte> buffer = stackalloc byte[RemoveEntityLength];
CreateRemoveEntity(ref buffer, serial);
CreateRemoveEntity(buffer, serial);
ns.Send(buffer);
}

View file

@ -23,7 +23,7 @@ namespace Server.Network
{
public const int MaxWorldItemPacketLength = 26;
public static int CreateWorldItem(ref Span<byte> buffer, Item item)
public static int CreateWorldItem(Span<byte> buffer, Item item)
{
var itemID = item is BaseMulti ? item.ItemID | 0x4000 : item.ItemID & 0x3FFF;
var hasAmount = item.Amount != 0;
@ -87,13 +87,13 @@ namespace Server.Network
Span<byte> buffer = stackalloc byte[MaxWorldItemPacketLength];
var length = ns.StygianAbyss ?
CreateWorldItemNew(ref buffer, item, ns.HighSeas) :
CreateWorldItem(ref buffer, item);
CreateWorldItemNew(buffer, item, ns.HighSeas) :
CreateWorldItem(buffer, item);
ns.Send(buffer.Slice(0, length));
}
public static int CreateWorldItemNew(ref Span<byte> buffer, Item item, bool isHS)
public static int CreateWorldItemNew(Span<byte> buffer, Item item, bool isHS)
{
var writer = new SpanWriter(buffer);
writer.Write((byte)0xF3); // Packet ID

View file

@ -43,8 +43,7 @@ namespace Server.Network
Span<byte> buffer = stackalloc byte[GetMaxMessageLocalizedLength(args)];
var length = CreateMessageLocalized(
ref buffer,
serial, graphic, type, hue, font, number, name, args
buffer, serial, graphic, type, hue, font, number, name, args
);
ns.Send(buffer.Slice(0, length));
@ -53,7 +52,7 @@ namespace Server.Network
public static int GetMaxMessageLocalizedLength(string args) => 50 + (args?.Length ?? 0) * 2;
public static int CreateMessageLocalized(
ref Span<byte> buffer,
Span<byte> buffer,
Serial serial, int graphic, MessageType type, int hue, int font, int number, string name = "", string args = ""
)
{
@ -95,8 +94,7 @@ namespace Server.Network
Span<byte> buffer = stackalloc byte[GetMaxMessageLocalizedAffixLength(affix, args)];
var length = CreateMessageLocalizedAffix(
ref buffer,
serial, graphic, type, hue, font, number, name, affixType, affix, args
buffer, serial, graphic, type, hue, font, number, name, affixType, affix, args
);
ns.Send(buffer.Slice(0, length));
@ -106,7 +104,7 @@ namespace Server.Network
52 + (affix?.Length ?? 0) + (args?.Length ?? 0) * 2;
public static int CreateMessageLocalizedAffix(
ref Span<byte> buffer,
Span<byte> buffer,
Serial serial, int graphic, MessageType type, int hue, int font, int number, string name,
AffixType affixType, string affix = "", string args = ""
)
@ -152,7 +150,7 @@ namespace Server.Network
Span<byte> buffer = stackalloc byte[GetMaxMessageLength(text)];
var length = CreateMessage(
ref buffer,
buffer,
serial,
graphic,
type,
@ -171,7 +169,7 @@ namespace Server.Network
public static int GetMaxMessageLength(string text) => 50 + (text?.Length ?? 0) * 2;
public static int CreateMessage(
ref Span<byte> buffer,
Span<byte> buffer,
Serial serial,
int graphic,
MessageType type,

View file

@ -26,7 +26,7 @@ namespace Server.Network
public const int MobileMovingPacketLength = 17;
public const int MobileMovingPacketCacheLength = MobileMovingPacketLength * 8 * 2; // 8 notoriety, 2 client versions
public static void CreateBondedStatus(ref Span<byte> buffer, Serial serial, bool bonded)
public static void CreateBondedStatus(Span<byte> buffer, Serial serial, bool bonded)
{
var writer = new SpanWriter(buffer);
writer.Write((byte)0xBF); // Packet ID
@ -55,7 +55,7 @@ namespace Server.Network
ns.Send(ref buffer, writer.Position);
}
public static void CreateDeathAnimation(ref Span<byte> buffer, Serial killed, Serial corpse)
public static void CreateDeathAnimation(Span<byte> buffer, Serial killed, Serial corpse)
{
var writer = new SpanWriter(buffer);
writer.Write((byte)0xAF); // Packet ID
@ -72,11 +72,11 @@ namespace Server.Network
}
Span<byte> span = stackalloc byte[DeathAnimationPacketLength];
CreateDeathAnimation(ref span, killed, corpse);
CreateDeathAnimation(span, killed, corpse);
ns.Send(span);
}
public static void CreateMobileMoving(ref Span<byte> buffer, Mobile m, int noto, bool stygianAbyss)
public static void CreateMobileMoving(Span<byte> buffer, Mobile m, int noto, bool stygianAbyss)
{
var loc = m.Location;
var hue = m.SolidHueOverride >= 0 ? m.SolidHueOverride : m.Hue;
@ -106,7 +106,7 @@ namespace Server.Network
}
Span<byte> span = stackalloc byte[MobileMovingPacketLength];
CreateMobileMoving(ref span, target, noto, ns.StygianAbyss);
CreateMobileMoving(span, target, noto, ns.StygianAbyss);
ns.Send(span);
}
@ -130,7 +130,7 @@ namespace Server.Network
// Packet not created yet
if (buffer[0] == 0)
{
CreateMobileMoving(ref buffer, target, noto, stygianAbyss);
CreateMobileMoving(buffer, target, noto, stygianAbyss);
}
ns.Send(buffer);