@@ -23,6 +23,7 @@ private struct ReceiveQueueItem
2323 public MessageHeader Header ;
2424 public ulong SenderId ;
2525 public float Timestamp ;
26+ public int MessageHeaderSerializedSize ;
2627 }
2728
2829 private struct SendQueueItem
@@ -46,27 +47,27 @@ public SendQueueItem(NetworkDelivery delivery, int writerSize, Allocator writerA
4647 private MessageHandler [ ] m_MessageHandlers = new MessageHandler [ 255 ] ;
4748 private Type [ ] m_ReverseTypeMap = new Type [ 255 ] ;
4849
49- private Dictionary < Type , byte > m_MessageTypes = new Dictionary < Type , byte > ( ) ;
50+ private Dictionary < Type , uint > m_MessageTypes = new Dictionary < Type , uint > ( ) ;
5051 private Dictionary < ulong , NativeList < SendQueueItem > > m_SendQueues = new Dictionary < ulong , NativeList < SendQueueItem > > ( ) ;
5152
5253 private List < INetworkHooks > m_Hooks = new List < INetworkHooks > ( ) ;
5354
54- private byte m_HighMessageType ;
55+ private uint m_HighMessageType ;
5556 private object m_Owner ;
5657 private IMessageSender m_MessageSender ;
5758 private bool m_Disposed ;
5859
5960 internal Type [ ] MessageTypes => m_ReverseTypeMap ;
6061 internal MessageHandler [ ] MessageHandlers => m_MessageHandlers ;
61- internal int MessageHandlerCount => m_HighMessageType ;
62+ internal uint MessageHandlerCount => m_HighMessageType ;
6263
63- internal byte GetMessageType ( Type t )
64+ internal uint GetMessageType ( Type t )
6465 {
6566 return m_MessageTypes [ t ] ;
6667 }
6768
6869 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 ;
7071
7172 internal struct MessageWithHandler
7273 {
@@ -165,14 +166,23 @@ internal void HandleIncomingData(ulong clientId, ArraySegment<byte> data, float
165166
166167 for ( var messageIdx = 0 ; messageIdx < batchHeader . BatchSize ; ++ messageIdx )
167168 {
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 )
169178 {
170179 NetworkLog . LogWarning ( "Received a batch that didn't have enough data for all of its batches, ending early!" ) ;
171- return ;
180+ throw ;
172181 }
173- batchReader . ReadValue ( out MessageHeader messageHeader ) ;
174182
175- if ( ! batchReader . TryBeginRead ( messageHeader . MessageSize ) )
183+ var receivedHeaderSize = batchReader . Position - position ;
184+
185+ if ( ! batchReader . TryBeginRead ( ( int ) messageHeader . MessageSize ) )
176186 {
177187 NetworkLog . LogWarning ( "Received a message that claimed a size larger than the packet, ending early!" ) ;
178188 return ;
@@ -185,9 +195,10 @@ internal void HandleIncomingData(ulong clientId, ArraySegment<byte> data, float
185195 // Copy the data for this message into a new FastBufferReader that owns that memory.
186196 // We can't guarantee the memory in the ArraySegment stays valid because we don't own it,
187197 // 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 ,
189200 } ) ;
190- batchReader . Seek ( batchReader . Position + messageHeader . MessageSize ) ;
201+ batchReader . Seek ( batchReader . Position + ( int ) messageHeader . MessageSize ) ;
191202 }
192203 for ( var hookIdx = 0 ; hookIdx < m_Hooks . Count ; ++ hookIdx )
193204 {
@@ -210,7 +221,7 @@ private bool CanReceive(ulong clientId, Type messageType)
210221 return true ;
211222 }
212223
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 )
214225 {
215226 if ( header . MessageType >= m_HighMessageType )
216227 {
@@ -223,8 +234,10 @@ public void HandleMessage(in MessageHeader header, FastBufferReader reader, ulon
223234 SystemOwner = m_Owner ,
224235 SenderId = senderId ,
225236 Timestamp = timestamp ,
226- Header = header
237+ Header = header ,
238+ SerializedHeaderSize = serializedHeaderSize ,
227239 } ;
240+
228241 var type = m_ReverseTypeMap [ header . MessageType ] ;
229242 if ( ! CanReceive ( senderId , type ) )
230243 {
@@ -236,6 +249,7 @@ public void HandleMessage(in MessageHeader header, FastBufferReader reader, ulon
236249 {
237250 m_Hooks [ hookIdx ] . OnBeforeReceiveMessage ( senderId , type , reader . Length + FastBufferWriter . GetWriteSize < MessageHeader > ( ) ) ;
238251 }
252+
239253 var handler = m_MessageHandlers [ header . MessageType ] ;
240254 using ( reader )
241255 {
@@ -265,7 +279,7 @@ internal unsafe void ProcessIncomingMessageQueue()
265279 {
266280 // Avoid copies...
267281 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 ) ;
269283 if ( m_Disposed )
270284 {
271285 return ;
@@ -328,64 +342,68 @@ internal unsafe int SendMessage<TMessageType, TClientIdListType>(in TMessageType
328342 }
329343
330344 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
333353 {
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 ) ;
335359
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 ] ;
339363
340- if ( ! CanSend ( clientId , typeof ( TMessageType ) , delivery ) )
341- {
342- continue ;
343- }
364+ if ( ! CanSend ( clientId , typeof ( TMessageType ) , delivery ) )
365+ {
366+ continue ;
367+ }
344368
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+ }
349373
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 )
352387 {
353388 sendQueueItem . Add ( new SendQueueItem ( delivery , NON_FRAGMENTED_MESSAGE_MAX_SIZE , Allocator . TempJob ,
354389 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 ) ) ;
368391 }
392+ }
369393
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 ) ;
377396
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 ) ;
385403 }
386-
387- return tmpSerializer . Length + FastBufferWriter . GetWriteSize < MessageHeader > ( ) ;
388404 }
405+
406+ return tmpSerializer . Length + headerSerializer . Length ;
389407 }
390408
391409 private struct PointerListWrapper < T > : IReadOnlyList < T >
0 commit comments