perf(net): frame recurring sends in place
Write normal game-message and ACK packet framing directly into bounded stack spans, hash fragments without materialization, and send the populated slice to the socket. Preserve exact wire bytes and ISAAC failure ordering with differential and zero-allocation tests.
This commit is contained in:
parent
e928c5dd02
commit
41c1a59392
7 changed files with 485 additions and 31 deletions
|
|
@ -149,4 +149,41 @@ public class GameMessageFragmentTests
|
|||
Assert.Equal(original.Header.Count, reparsed.Value.Header.Count);
|
||||
Assert.Equal(original.Payload, reparsed.Value.Payload);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void WriteSingleFragment_MatchesOwnedBuildAndSerialize()
|
||||
{
|
||||
byte[] message = [1, 2, 3, 4, 5, 6];
|
||||
MessageFragment owned =
|
||||
GameMessageFragment.BuildSingleFragment(
|
||||
fragmentSequence: 99,
|
||||
queue: GameMessageGroup.ControlQueue,
|
||||
gameMessageBytes: message);
|
||||
byte[] expected = GameMessageFragment.Serialize(owned);
|
||||
Span<byte> destination = stackalloc byte[
|
||||
MessageFragmentHeader.MaxFragmentSize];
|
||||
|
||||
int written = GameMessageFragment.WriteSingleFragment(
|
||||
destination,
|
||||
fragmentSequence: 99,
|
||||
queue: GameMessageGroup.ControlQueue,
|
||||
gameMessageBytes: message);
|
||||
|
||||
Assert.Equal(expected.Length, written);
|
||||
Assert.Equal(expected, destination.Slice(0, written).ToArray());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void WriteSingleFragment_ShortDestination_Throws()
|
||||
{
|
||||
byte[] message = [1, 2, 3, 4];
|
||||
Assert.Throws<ArgumentException>(
|
||||
() => GameMessageFragment.WriteSingleFragment(
|
||||
new byte[
|
||||
MessageFragmentHeader.Size
|
||||
+ message.Length - 1],
|
||||
fragmentSequence: 1,
|
||||
queue: GameMessageGroup.UIQueue,
|
||||
gameMessageBytes: message));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue