Просмотр исходного кода

改了下kcp的实现,把kcp的偏移5字节改成用span偏移实现,这样会更简单一些,只要操作buffer就偏移5字节

tanghai 2 лет назад
Родитель
Сommit
a4fe2ffbb1
1 измененных файлов с 11 добавлено и 11 удалено
  1. 11 11
      Unity/Assets/Scripts/ThirdParty/Kcp/Kcp.cs

+ 11 - 11
Unity/Assets/Scripts/ThirdParty/Kcp/Kcp.cs

@@ -122,7 +122,7 @@ namespace ET
             ssthresh  = THRESH_INIT;
             ssthresh  = THRESH_INIT;
             fastlimit = FASTACK_LIMIT;
             fastlimit = FASTACK_LIMIT;
             dead_link = DEADLINK;
             dead_link = DEADLINK;
-            buffer = new byte[(mtu + OVERHEAD) * 3];
+            buffer = new byte[(mtu + OVERHEAD) * 3 + RESERVED_BYTE];
         }
         }
 
 
         // ikcp_segment_new
         // ikcp_segment_new
@@ -778,10 +778,10 @@ namespace ET
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         void MakeSpace(ref int size, int space)
         void MakeSpace(ref int size, int space)
         {
         {
-            if (size - RESERVED_BYTE + space > mtu)
+            if (size + space > mtu)
             {
             {
                 output(buffer, size);
                 output(buffer, size);
-                size = RESERVED_BYTE;
+                size = 0;
             }
             }
         }
         }
 
 
@@ -790,7 +790,7 @@ namespace ET
         void FlushBuffer(int size)
         void FlushBuffer(int size)
         {
         {
             // flush buffer up to 'offset' (<= MTU)
             // flush buffer up to 'offset' (<= MTU)
-            if (size > RESERVED_BYTE)
+            if (size > 0)
             {
             {
                 output(buffer, size);
                 output(buffer, size);
             }
             }
@@ -804,7 +804,7 @@ namespace ET
         // with congestion control, the window will be extremely small(!).
         // with congestion control, the window will be extremely small(!).
         public void Flush()
         public void Flush()
         {
         {
-            int size  = RESERVED_BYTE;     // amount of bytes to flush. 'buffer ptr' in C.
+            int size  = 0;     // amount of bytes to flush. 'buffer ptr' in C.
             bool lost = false; // lost segments
             bool lost = false; // lost segments
 
 
             // update needs to be called before flushing
             // update needs to be called before flushing
@@ -832,7 +832,7 @@ namespace ET
                 // ikcp_ack_get assigns ack[i] to seg.sn, seg.ts
                 // ikcp_ack_get assigns ack[i] to seg.sn, seg.ts
                 seg.SegHead.sn = ack.serialNumber;
                 seg.SegHead.sn = ack.serialNumber;
                 seg.SegHead.ts = ack.timestamp;
                 seg.SegHead.ts = ack.timestamp;
-                seg.Encode(buffer.AsSpan(size), ref size);
+                seg.Encode(buffer.AsSpan(size + RESERVED_BYTE), ref size);
             }
             }
             acklist.Clear();
             acklist.Clear();
 
 
@@ -869,7 +869,7 @@ namespace ET
             {
             {
                 seg.SegHead.cmd = CMD_WASK;
                 seg.SegHead.cmd = CMD_WASK;
                 MakeSpace(ref size, OVERHEAD);
                 MakeSpace(ref size, OVERHEAD);
-                seg.Encode(buffer.AsSpan(size), ref size);
+                seg.Encode(buffer.AsSpan(size + RESERVED_BYTE), ref size);
             }
             }
 
 
             // flush window probing commands
             // flush window probing commands
@@ -877,7 +877,7 @@ namespace ET
             {
             {
                 seg.SegHead.cmd = CMD_WINS;
                 seg.SegHead.cmd = CMD_WINS;
                 MakeSpace(ref size, OVERHEAD);
                 MakeSpace(ref size, OVERHEAD);
-                seg.Encode(buffer.AsSpan(size), ref size);
+                seg.Encode(buffer.AsSpan(size + RESERVED_BYTE), ref size);
             }
             }
 
 
             probe = 0;
             probe = 0;
@@ -986,11 +986,11 @@ namespace ET
                     int need = OVERHEAD + segment.WrittenCount;
                     int need = OVERHEAD + segment.WrittenCount;
                     this.MakeSpace(ref size, need);
                     this.MakeSpace(ref size, need);
 
 
-                    segment.Encode(this.buffer.AsSpan(size),ref size);
+                    segment.Encode(this.buffer.AsSpan(size + RESERVED_BYTE),ref size);
 
 
                     if (segment.WrittenCount > 0)
                     if (segment.WrittenCount > 0)
                     {
                     {
-                        segment.WrittenBuffer.CopyTo(this.buffer.AsSpan(size));
+                        segment.WrittenBuffer.CopyTo(this.buffer.AsSpan(size + RESERVED_BYTE));
                         
                         
                         size += segment.WrittenCount;
                         size += segment.WrittenCount;
                     }
                     }
@@ -1154,7 +1154,7 @@ namespace ET
             if (mtu < 50 || mtu < OVERHEAD)
             if (mtu < 50 || mtu < OVERHEAD)
                 this.ThrowMTUException();
                 this.ThrowMTUException();
 
 
-            buffer = new byte[(mtu + OVERHEAD) * 3];
+            buffer = new byte[(mtu + OVERHEAD) * 3 + RESERVED_BYTE];
             this.mtu = mtu;
             this.mtu = mtu;
             mss = mtu - OVERHEAD;
             mss = mtu - OVERHEAD;
         }
         }