|
7 | 7 |
|
8 | 8 | namespace ReliableNetcode |
9 | 9 | { |
10 | | - internal class SentPacketData |
11 | | - { |
12 | | - public double time; |
13 | | - public bool acked; |
14 | | - public uint packetBytes; |
15 | | - } |
| 10 | + internal class SentPacketData |
| 11 | + { |
| 12 | + public double time; |
| 13 | + public bool acked; |
| 14 | + public uint packetBytes; |
| 15 | + } |
16 | 16 |
|
17 | | - internal class ReceivedPacketData |
18 | | - { |
19 | | - public double time; |
20 | | - public uint packetBytes; |
21 | | - } |
| 17 | + internal class ReceivedPacketData |
| 18 | + { |
| 19 | + public double time; |
| 20 | + public uint packetBytes; |
| 21 | + } |
22 | 22 |
|
23 | | - internal class FragmentReassemblyData |
24 | | - { |
25 | | - public ushort Sequence; |
26 | | - public ushort Ack; |
27 | | - public uint AckBits; |
28 | | - public int NumFragmentsReceived; |
29 | | - public int NumFragmentsTotal; |
30 | | - public ByteBuffer PacketDataBuffer = new ByteBuffer(); |
31 | | - public int PacketBytes; |
32 | | - public int PacketHeaderBytes; |
33 | | - public bool[] FragmentReceived = new bool[256]; |
| 23 | + internal class FragmentReassemblyData |
| 24 | + { |
| 25 | + public ushort Sequence; |
| 26 | + public ushort Ack; |
| 27 | + public uint AckBits; |
| 28 | + public int NumFragmentsReceived; |
| 29 | + public int NumFragmentsTotal; |
| 30 | + public ByteBuffer PacketDataBuffer = new ByteBuffer(); |
| 31 | + public int PacketBytes; |
| 32 | + public int HeaderOffset; |
| 33 | + public bool[] FragmentReceived = new bool[256]; |
34 | 34 |
|
35 | | - public void StoreFragmentData(byte channelID, ushort sequence, ushort ack, uint ackBits, int fragmentID, int fragmentSize, byte[] fragmentData, int fragmentBytes) |
36 | | - { |
37 | | - int copyOffset = 0; |
| 35 | + public void StoreFragmentData(byte channelID, ushort sequence, ushort ack, uint ackBits, int fragmentID, int fragmentSize, byte[] fragmentData, int fragmentBytes) |
| 36 | + { |
| 37 | + int copyOffset = 0; |
38 | 38 |
|
39 | | - if (fragmentID == 0) |
40 | | - { |
41 | | - byte[] packetHeader = BufferPool.GetBuffer(Defines.MAX_PACKET_HEADER_BYTES); |
42 | | - this.PacketHeaderBytes = PacketIO.WritePacketHeader(packetHeader, channelID, sequence, ack, ackBits); |
43 | | - |
44 | | - this.PacketDataBuffer.SetSize(this.PacketHeaderBytes + fragmentSize); |
| 39 | + if (fragmentID == 0) { |
| 40 | + byte[] packetHeader = BufferPool.GetBuffer(Defines.MAX_PACKET_HEADER_BYTES); |
| 41 | + int headerBytes = PacketIO.WritePacketHeader(packetHeader, channelID, sequence, ack, ackBits); |
| 42 | + this.HeaderOffset = Defines.MAX_PACKET_HEADER_BYTES - headerBytes; |
45 | 43 |
|
46 | | - this.PacketDataBuffer.BufferCopy(packetHeader, 0, 0, this.PacketHeaderBytes); |
47 | | - copyOffset = this.PacketHeaderBytes; |
48 | | - |
49 | | - fragmentBytes -= this.PacketHeaderBytes; |
| 44 | + if (this.PacketDataBuffer.Length < (Defines.MAX_PACKET_HEADER_BYTES + fragmentSize)) |
| 45 | + this.PacketDataBuffer.SetSize(Defines.MAX_PACKET_HEADER_BYTES + fragmentSize); |
50 | 46 |
|
51 | | - BufferPool.ReturnBuffer(packetHeader); |
52 | | - } |
| 47 | + this.PacketDataBuffer.BufferCopy(packetHeader, 0, this.HeaderOffset, headerBytes); |
| 48 | + copyOffset = headerBytes; |
53 | 49 |
|
54 | | - int writePos = this.PacketHeaderBytes + fragmentID * fragmentSize; |
55 | | - int end = writePos + fragmentBytes; |
56 | | - this.PacketDataBuffer.SetSize(end); |
| 50 | + fragmentBytes -= headerBytes; |
57 | 51 |
|
58 | | - if (fragmentID == NumFragmentsTotal - 1) |
59 | | - { |
60 | | - this.PacketBytes = (this.NumFragmentsTotal - 1) * fragmentSize + fragmentBytes; |
61 | | - } |
| 52 | + BufferPool.ReturnBuffer(packetHeader); |
| 53 | + } |
62 | 54 |
|
63 | | - this.PacketDataBuffer.BufferCopy(fragmentData, copyOffset, this.PacketHeaderBytes + fragmentID * fragmentSize, fragmentBytes); |
64 | | - } |
65 | | - } |
| 55 | + int writePos = Defines.MAX_PACKET_HEADER_BYTES + fragmentID * fragmentSize; |
| 56 | + int end = writePos + fragmentBytes; |
| 57 | + |
| 58 | + if (this.PacketDataBuffer.Length < end) |
| 59 | + this.PacketDataBuffer.SetSize(end); |
| 60 | + |
| 61 | + if (fragmentID == NumFragmentsTotal - 1) { |
| 62 | + this.PacketBytes = (this.NumFragmentsTotal - 1) * fragmentSize + fragmentBytes; |
| 63 | + } |
| 64 | + |
| 65 | + this.PacketDataBuffer.BufferCopy(fragmentData, copyOffset, Defines.MAX_PACKET_HEADER_BYTES + fragmentID * fragmentSize, fragmentBytes); |
| 66 | + } |
| 67 | + } |
66 | 68 | } |
0 commit comments