@@ -23,6 +23,7 @@ private struct ReceiveQueueItem
23
23
public MessageHeader Header ;
24
24
public ulong SenderId ;
25
25
public float Timestamp ;
26
+ public int MessageHeaderSerializedSize ;
26
27
}
27
28
28
29
private struct SendQueueItem
@@ -46,27 +47,27 @@ public SendQueueItem(NetworkDelivery delivery, int writerSize, Allocator writerA
46
47
private MessageHandler [ ] m_MessageHandlers = new MessageHandler [ 255 ] ;
47
48
private Type [ ] m_ReverseTypeMap = new Type [ 255 ] ;
48
49
49
- private Dictionary < Type , byte > m_MessageTypes = new Dictionary < Type , byte > ( ) ;
50
+ private Dictionary < Type , uint > m_MessageTypes = new Dictionary < Type , uint > ( ) ;
50
51
private Dictionary < ulong , NativeList < SendQueueItem > > m_SendQueues = new Dictionary < ulong , NativeList < SendQueueItem > > ( ) ;
51
52
52
53
private List < INetworkHooks > m_Hooks = new List < INetworkHooks > ( ) ;
53
54
54
- private byte m_HighMessageType ;
55
+ private uint m_HighMessageType ;
55
56
private object m_Owner ;
56
57
private IMessageSender m_MessageSender ;
57
58
private bool m_Disposed ;
58
59
59
60
internal Type [ ] MessageTypes => m_ReverseTypeMap ;
60
61
internal MessageHandler [ ] MessageHandlers => m_MessageHandlers ;
61
- internal int MessageHandlerCount => m_HighMessageType ;
62
+ internal uint MessageHandlerCount => m_HighMessageType ;
62
63
63
- internal byte GetMessageType ( Type t )
64
+ internal uint GetMessageType ( Type t )
64
65
{
65
66
return m_MessageTypes [ t ] ;
66
67
}
67
68
68
69
public const int NON_FRAGMENTED_MESSAGE_MAX_SIZE = 1300 ;
69
- public const int FRAGMENTED_MESSAGE_MAX_SIZE = 64000 ;
70
+ public const int FRAGMENTED_MESSAGE_MAX_SIZE = int . MaxValue ;
70
71
71
72
internal struct MessageWithHandler
72
73
{
@@ -165,14 +166,23 @@ internal void HandleIncomingData(ulong clientId, ArraySegment<byte> data, float
165
166
166
167
for ( var messageIdx = 0 ; messageIdx < batchHeader . BatchSize ; ++ messageIdx )
167
168
{
168
- if ( ! batchReader . TryBeginRead ( sizeof ( MessageHeader ) ) )
169
+
170
+ var messageHeader = new MessageHeader ( ) ;
171
+ var position = batchReader . Position ;
172
+ try
173
+ {
174
+ ByteUnpacker . ReadValueBitPacked ( batchReader , out messageHeader . MessageType ) ;
175
+ ByteUnpacker . ReadValueBitPacked ( batchReader , out messageHeader . MessageSize ) ;
176
+ }
177
+ catch ( OverflowException )
169
178
{
170
179
NetworkLog . LogWarning ( "Received a batch that didn't have enough data for all of its batches, ending early!" ) ;
171
- return ;
180
+ throw ;
172
181
}
173
- batchReader . ReadValue ( out MessageHeader messageHeader ) ;
174
182
175
- if ( ! batchReader . TryBeginRead ( messageHeader . MessageSize ) )
183
+ var receivedHeaderSize = batchReader . Position - position ;
184
+
185
+ if ( ! batchReader . TryBeginRead ( ( int ) messageHeader . MessageSize ) )
176
186
{
177
187
NetworkLog . LogWarning ( "Received a message that claimed a size larger than the packet, ending early!" ) ;
178
188
return ;
@@ -185,9 +195,10 @@ internal void HandleIncomingData(ulong clientId, ArraySegment<byte> data, float
185
195
// Copy the data for this message into a new FastBufferReader that owns that memory.
186
196
// We can't guarantee the memory in the ArraySegment stays valid because we don't own it,
187
197
// so we must move it to memory we do own.
188
- Reader = new FastBufferReader ( batchReader . GetUnsafePtrAtCurrentPosition ( ) , Allocator . TempJob , messageHeader . MessageSize )
198
+ Reader = new FastBufferReader ( batchReader . GetUnsafePtrAtCurrentPosition ( ) , Allocator . TempJob , ( int ) messageHeader . MessageSize ) ,
199
+ MessageHeaderSerializedSize = receivedHeaderSize ,
189
200
} ) ;
190
- batchReader . Seek ( batchReader . Position + messageHeader . MessageSize ) ;
201
+ batchReader . Seek ( batchReader . Position + ( int ) messageHeader . MessageSize ) ;
191
202
}
192
203
for ( var hookIdx = 0 ; hookIdx < m_Hooks . Count ; ++ hookIdx )
193
204
{
@@ -210,7 +221,7 @@ private bool CanReceive(ulong clientId, Type messageType)
210
221
return true ;
211
222
}
212
223
213
- public void HandleMessage ( in MessageHeader header , FastBufferReader reader , ulong senderId , float timestamp )
224
+ public void HandleMessage ( in MessageHeader header , FastBufferReader reader , ulong senderId , float timestamp , int serializedHeaderSize )
214
225
{
215
226
if ( header . MessageType >= m_HighMessageType )
216
227
{
@@ -223,8 +234,10 @@ public void HandleMessage(in MessageHeader header, FastBufferReader reader, ulon
223
234
SystemOwner = m_Owner ,
224
235
SenderId = senderId ,
225
236
Timestamp = timestamp ,
226
- Header = header
237
+ Header = header ,
238
+ SerializedHeaderSize = serializedHeaderSize ,
227
239
} ;
240
+
228
241
var type = m_ReverseTypeMap [ header . MessageType ] ;
229
242
if ( ! CanReceive ( senderId , type ) )
230
243
{
@@ -236,6 +249,7 @@ public void HandleMessage(in MessageHeader header, FastBufferReader reader, ulon
236
249
{
237
250
m_Hooks [ hookIdx ] . OnBeforeReceiveMessage ( senderId , type , reader . Length + FastBufferWriter . GetWriteSize < MessageHeader > ( ) ) ;
238
251
}
252
+
239
253
var handler = m_MessageHandlers [ header . MessageType ] ;
240
254
using ( reader )
241
255
{
@@ -265,7 +279,7 @@ internal unsafe void ProcessIncomingMessageQueue()
265
279
{
266
280
// Avoid copies...
267
281
ref var item = ref m_IncomingMessageQueue . GetUnsafeList ( ) ->ElementAt ( index ) ;
268
- HandleMessage ( item . Header , item . Reader , item . SenderId , item . Timestamp ) ;
282
+ HandleMessage ( item . Header , item . Reader , item . SenderId , item . Timestamp , item . MessageHeaderSerializedSize ) ;
269
283
if ( m_Disposed )
270
284
{
271
285
return ;
@@ -328,64 +342,68 @@ internal unsafe int SendMessage<TMessageType, TClientIdListType>(in TMessageType
328
342
}
329
343
330
344
var maxSize = delivery == NetworkDelivery . ReliableFragmentedSequenced ? FRAGMENTED_MESSAGE_MAX_SIZE : NON_FRAGMENTED_MESSAGE_MAX_SIZE ;
331
- var tmpSerializer = new FastBufferWriter ( NON_FRAGMENTED_MESSAGE_MAX_SIZE - FastBufferWriter . GetWriteSize < MessageHeader > ( ) , Allocator . Temp , maxSize - FastBufferWriter . GetWriteSize < MessageHeader > ( ) ) ;
332
- using ( tmpSerializer )
345
+
346
+ using var tmpSerializer = new FastBufferWriter ( NON_FRAGMENTED_MESSAGE_MAX_SIZE - FastBufferWriter . GetWriteSize < MessageHeader > ( ) , Allocator . Temp , maxSize - FastBufferWriter . GetWriteSize < MessageHeader > ( ) ) ;
347
+
348
+ message . Serialize ( tmpSerializer ) ;
349
+
350
+ using var headerSerializer = new FastBufferWriter ( FastBufferWriter . GetWriteSize < MessageHeader > ( ) , Allocator . Temp ) ;
351
+
352
+ var header = new MessageHeader
333
353
{
334
- message . Serialize ( tmpSerializer ) ;
354
+ MessageSize = ( ushort ) tmpSerializer . Length ,
355
+ MessageType = m_MessageTypes [ typeof ( TMessageType ) ] ,
356
+ } ;
357
+ BytePacker . WriteValueBitPacked ( headerSerializer , header . MessageType ) ;
358
+ BytePacker . WriteValueBitPacked ( headerSerializer , header . MessageSize ) ;
335
359
336
- for ( var i = 0 ; i < clientIds . Count ; ++ i )
337
- {
338
- var clientId = clientIds [ i ] ;
360
+ for ( var i = 0 ; i < clientIds . Count ; ++ i )
361
+ {
362
+ var clientId = clientIds [ i ] ;
339
363
340
- if ( ! CanSend ( clientId , typeof ( TMessageType ) , delivery ) )
341
- {
342
- continue ;
343
- }
364
+ if ( ! CanSend ( clientId , typeof ( TMessageType ) , delivery ) )
365
+ {
366
+ continue ;
367
+ }
344
368
345
- for ( var hookIdx = 0 ; hookIdx < m_Hooks . Count ; ++ hookIdx )
346
- {
347
- m_Hooks [ hookIdx ] . OnBeforeSendMessage ( clientId , typeof ( TMessageType ) , delivery ) ;
348
- }
369
+ for ( var hookIdx = 0 ; hookIdx < m_Hooks . Count ; ++ hookIdx )
370
+ {
371
+ m_Hooks [ hookIdx ] . OnBeforeSendMessage ( clientId , typeof ( TMessageType ) , delivery ) ;
372
+ }
349
373
350
- var sendQueueItem = m_SendQueues [ clientId ] ;
351
- if ( sendQueueItem . Length == 0 )
374
+ var sendQueueItem = m_SendQueues [ clientId ] ;
375
+ if ( sendQueueItem . Length == 0 )
376
+ {
377
+ sendQueueItem . Add ( new SendQueueItem ( delivery , NON_FRAGMENTED_MESSAGE_MAX_SIZE , Allocator . TempJob ,
378
+ maxSize ) ) ;
379
+ sendQueueItem . GetUnsafeList ( ) ->ElementAt ( 0 ) . Writer . Seek ( sizeof ( BatchHeader ) ) ;
380
+ }
381
+ else
382
+ {
383
+ ref var lastQueueItem = ref sendQueueItem . GetUnsafeList ( ) ->ElementAt ( sendQueueItem . Length - 1 ) ;
384
+ if ( lastQueueItem . NetworkDelivery != delivery ||
385
+ lastQueueItem . Writer . MaxCapacity - lastQueueItem . Writer . Position
386
+ < tmpSerializer . Length + headerSerializer . Length )
352
387
{
353
388
sendQueueItem . Add ( new SendQueueItem ( delivery , NON_FRAGMENTED_MESSAGE_MAX_SIZE , Allocator . TempJob ,
354
389
maxSize ) ) ;
355
- sendQueueItem . GetUnsafeList ( ) ->ElementAt ( 0 ) . Writer . Seek ( sizeof ( BatchHeader ) ) ;
356
- }
357
- else
358
- {
359
- ref var lastQueueItem = ref sendQueueItem . GetUnsafeList ( ) ->ElementAt ( sendQueueItem . Length - 1 ) ;
360
- if ( lastQueueItem . NetworkDelivery != delivery ||
361
- lastQueueItem . Writer . MaxCapacity - lastQueueItem . Writer . Position
362
- < tmpSerializer . Length + FastBufferWriter . GetWriteSize < MessageHeader > ( ) )
363
- {
364
- sendQueueItem . Add ( new SendQueueItem ( delivery , NON_FRAGMENTED_MESSAGE_MAX_SIZE , Allocator . TempJob ,
365
- maxSize ) ) ;
366
- sendQueueItem . GetUnsafeList ( ) ->ElementAt ( sendQueueItem . Length - 1 ) . Writer . Seek ( sizeof ( BatchHeader ) ) ;
367
- }
390
+ sendQueueItem . GetUnsafeList ( ) ->ElementAt ( sendQueueItem . Length - 1 ) . Writer . Seek ( sizeof ( BatchHeader ) ) ;
368
391
}
392
+ }
369
393
370
- ref var writeQueueItem = ref sendQueueItem . GetUnsafeList ( ) ->ElementAt ( sendQueueItem . Length - 1 ) ;
371
- writeQueueItem . Writer . TryBeginWrite ( tmpSerializer . Length + FastBufferWriter . GetWriteSize < MessageHeader > ( ) ) ;
372
- var header = new MessageHeader
373
- {
374
- MessageSize = ( ushort ) tmpSerializer . Length ,
375
- MessageType = m_MessageTypes [ typeof ( TMessageType ) ] ,
376
- } ;
394
+ ref var writeQueueItem = ref sendQueueItem . GetUnsafeList ( ) ->ElementAt ( sendQueueItem . Length - 1 ) ;
395
+ writeQueueItem . Writer . TryBeginWrite ( tmpSerializer . Length + headerSerializer . Length ) ;
377
396
378
- writeQueueItem . Writer . WriteValue ( header ) ;
379
- writeQueueItem . Writer . WriteBytes ( tmpSerializer . GetUnsafePtr ( ) , tmpSerializer . Length ) ;
380
- writeQueueItem . BatchHeader . BatchSize ++ ;
381
- for ( var hookIdx = 0 ; hookIdx < m_Hooks . Count ; ++ hookIdx )
382
- {
383
- m_Hooks [ hookIdx ] . OnAfterSendMessage ( clientId , typeof ( TMessageType ) , delivery , tmpSerializer . Length + FastBufferWriter . GetWriteSize < MessageHeader > ( ) ) ;
384
- }
397
+ writeQueueItem . Writer . WriteBytes ( headerSerializer . GetUnsafePtr ( ) , headerSerializer . Length ) ;
398
+ writeQueueItem . Writer . WriteBytes ( tmpSerializer . GetUnsafePtr ( ) , tmpSerializer . Length ) ;
399
+ writeQueueItem . BatchHeader . BatchSize ++ ;
400
+ for ( var hookIdx = 0 ; hookIdx < m_Hooks . Count ; ++ hookIdx )
401
+ {
402
+ m_Hooks [ hookIdx ] . OnAfterSendMessage ( clientId , typeof ( TMessageType ) , delivery , tmpSerializer . Length + headerSerializer . Length ) ;
385
403
}
386
-
387
- return tmpSerializer . Length + FastBufferWriter . GetWriteSize < MessageHeader > ( ) ;
388
404
}
405
+
406
+ return tmpSerializer . Length + headerSerializer . Length ;
389
407
}
390
408
391
409
private struct PointerListWrapper < T > : IReadOnlyList < T >
0 commit comments