예제 #1
0
 private void OnAck(Packet packet)
 {
     // 遍历处理超过32次收包未被应答的包
     foreach (byte seq in quantics.Keys)
     {
         if (packet.ack > seq && (packet.ack - seq).value >= 32)
         {
             cacheLost.Add(seq);
         }
     }
     foreach (byte seq in cacheLost)
     {
         Packet p = quantics[seq];
         quantics.Remove(seq);
         OnPacketLoss(p);
     }
     cacheLost.Clear();
     // 对已发包列表应用应答,移除已被应答的包
     for (int i = 0; i < 32; i++)
     {
         if ((packet.ackbit & (1 << i)) > 0)
         {
             byte seq = (packet.ack - i).value;
             if (quantics.ContainsKey(seq))
             {
                 Packet p = quantics[seq];
                 quantics.Remove(seq);
                 OnPacketArrived(p);
             }
         }
     }
     // 写收包应答
     if (packet.sequence > ack)
     {
         ackbit  = ackbit << (int)(packet.sequence - ack).value;
         ackbit |= (1 << 0);
         ack     = packet.sequence;
         OnPacketReceived(packet);
     }
     else
     {
         uint value = (uint)(1 << (int)(ack - packet.sequence).value);
         if ((ackbit & value) == 0)
         {
             // 如果收到的包是未被处理的
             ackbit |= value;
             OnPacketReceived(packet);
         }
         else
         {
             Debug.Log("Receive packet already handle : sequence " + packet.sequence);
         }
     }
 }
예제 #2
0
    public override void Parse(BinaryReader reader)
    {
        mFrame = reader.ReadByte();
        mDatas.Clear();
        byte length = reader.ReadByte();

        for (byte i = 0; i < length; i++)
        {
            PlayerInput input = new PlayerInput(mFrame);
            input.Parse(reader);
            mDatas.Add(input);
        }
    }
예제 #3
0
    public override void Parse(BinaryReader reader)
    {
        type     = (PacketType)reader.ReadByte();
        id       = reader.ReadUInt32();
        sequence = reader.ReadByte();
        ack      = reader.ReadByte();
        ackbit   = reader.ReadUInt32();
        long dataLen = reader.BaseStream.Length - reader.BaseStream.Position;

        if (dataLen > 0)
        {
            data = new byte[dataLen];
            reader.Read(data, 0, data.Length);
        }
    }
예제 #4
0
 public USocket(uint id)
 {
     this.id         = id;
     netState        = NetState.None;
     sequence        = 0;
     ack             = 0;
     ackbit          = 0;
     quantics        = new Dictionary <byte, Packet>();
     cacheSend       = new List <Packet>();
     cacheReceived   = new List <Packet>();
     cacheLost       = new List <byte>();
     lastConnectTime = lastReceviedTime = DateTime.MinValue;
     connectTimes    = 0;
     sends           = new LimitedQueue <Packet>(10);
     receives        = new LimitedQueue <Packet>(10);
 }
예제 #5
0
 private void FixedUpdate()
 {
     if (LSState > LockStepState.None)
     {
         if (LSFrameAchieve)
         {
             if (LSAccFrame == 0)
             {
                 float deltaTime = Time.fixedDeltaTime;
                 float accTime   = LSTick + deltaTime;
                 LSAccFrame = Mathf.FloorToInt(accTime / NetConfig.TPF);
                 LSTick     = accTime - LSAccFrame * NetConfig.TPF;
             }
             while (LSAccFrame > 0)
             {
                 SendPlayerInput();
                 LSAccFrame    -= 1;
                 LSFrame       += 1;
                 LSFrameAchieve = false;
                 if (LSState == LockStepState.Prepare)
                 {
                     if (LSFrame > new RUShortInt(NetConfig.PDBL - 1))
                     {
                         LSState = LockStepState.Start;
                     }
                     else
                     {
                         LSFrameAchieve = true;
                     }
                 }
                 if (LSState == LockStepState.Start)
                 {
                     LSFrameAchieve = LockStepUpdate();
                 }
                 if (!LSFrameAchieve)
                 {
                     break;
                 }
             }
         }
         else
         {
             LSFrameAchieve = LockStepUpdate();
         }
     }
 }
예제 #6
0
 public virtual void Close()
 {
     netState = NetState.None;
     sequence = 0;
     ack      = 0;
     ackbit   = 0;
     quantics.Clear();
     cacheSend.Clear();
     cacheReceived.Clear();
     cacheLost.Clear();
     lastConnectTime = lastReceviedTime = DateTime.MinValue;
     connectTimes    = 0;
     sends.Clear();
     receives.Clear();
     try
     {
         if (rc != null)
         {
             rc.Close();
         }
     }
     catch (Exception ecp)
     {
         Debug.LogError(ecp.Message + "\n" + ecp.StackTrace);
     }
     try
     {
         if (sc != null)
         {
             sc.Close();
         }
     }
     catch (Exception ecp)
     {
         Debug.LogError(ecp.Message + "\n" + ecp.StackTrace);
     }
     rc = null;
     sc = null;
     ep = null;
 }
예제 #7
0
 private void ReceivePacketHandler(Packet packet)
 {
     if (packet.type == PacketType.Message)
     {
         if (LSState == LockStepState.None)
         {
             LSState = LockStepState.Prepare;
         }
     }
     else if (packet.type == PacketType.LockStep)
     {
         PlayersInputBuffer pib = new PlayersInputBuffer();
         pib.Parse(packet.data);
         RUShortInt CFrame = LSFrame + RUShortInt.Reverse(NetConfig.PDBL);
         int        index  = pib.buffer.FindIndex((PlayersInput each) => each.frame == CFrame);
         if (index > 0)
         {
             pib.buffer.RemoveRange(0, index);
         }
         SLSBuffer.Merge(pib);
     }
 }
예제 #8
0
    private bool LockStepUpdate()
    {
        float speedTo = 1;

        RUShortInt          CFrame = LSFrame + RUShortInt.Reverse(NetConfig.PDBL);
        List <PlayersInput> buffer = SLSBuffer.buffer;
        int lsIndex = buffer.FindIndex(0, buffer.Count, (PlayersInput each) => each.frame == CFrame);

        if (lsIndex == -1)
        {
            speedTo = 0;
        }
        else
        {
            RUShortInt minFrame = buffer[0].frame;
            RUShortInt maxFrame = buffer[buffer.Count - 1].frame;
            if (CFrame == minFrame)
            {
                uint dist = (maxFrame - minFrame).value;
                speedTo = dist <= NetConfig.PDBL ? 1 : 2;
            }
            else
            {
                speedTo = 0;
            }
        }

        gameSpeed = speedTo;
        if (gameSpeed > 0)
        {
            ApplyPlayersInput(SLSBuffer.buffer[0]);
            SLSBuffer.buffer.RemoveAt(0);
            return(true);
        }
        return(false);
    }
예제 #9
0
 public PlayerInput(RUShortInt frame) : base()
 {
     mFrame = frame;
 }
예제 #10
0
 /// <summary>
 /// 取反
 /// </summary>
 /// <param name="val"></param>
 /// <returns></returns>
 public static RUShortInt Reverse(RUShortInt val)
 {
     return(new RUShortInt(byte.MaxValue - val.value + 1));
 }
예제 #11
0
    private void OnGUI()
    {
        GUILayout.BeginHorizontal();
        GUILayout.Label("ID");
        ID = uint.Parse(GUILayout.TextField(ID.ToString()));
        GUILayout.EndHorizontal();

        GUILayout.BeginHorizontal();
        GUILayout.Label("server ip");
        byte[] bip = serverAddress.GetAddressBytes();
        for (int i = 0; i < bip.Length; i++)
        {
            bip[i] = System.Convert.ToByte(GUILayout.TextField(bip[i].ToString()));
        }
        serverAddress = new IPAddress(bip);
        GUILayout.EndHorizontal();

        GUILayout.BeginHorizontal();
        GUILayout.Label("server port");
        serverPort = int.Parse(GUILayout.TextField(serverPort.ToString()));
        GUILayout.EndHorizontal();

        GUILayout.BeginHorizontal();
        GUILayout.Label("client port");
        clientPort = int.Parse(GUILayout.TextField(clientPort.ToString()));
        GUILayout.EndHorizontal();

        GUI.enabled = socket == null || socket.netState == NetState.None;
        if (GUILayout.Button("Connect", GUILayout.Width(200), GUILayout.Width(80)))
        {
            LSState        = LockStepState.None;
            LSTick         = 0;
            LSFrame        = 0;
            LSFrameAchieve = true;
            LSAccFrame     = 0;
            SLSBuffer      = new PlayersInputBuffer();
            socket         = new AppSocket(ID);
            socket.packetHandler[PacketType.Message]  = ReceivePacketHandler;
            socket.packetHandler[PacketType.LockStep] = ReceivePacketHandler;
            socket.Connect(serverAddress, serverPort, clientPort);
        }
        GUI.enabled = true;

        GUI.color = socket != null && socket.netState == NetState.Connected ? Color.green : Color.white;
        GUILayout.Label("状态: " + (socket != null ? socket.netState : NetState.None));
        GUI.color = Color.white;
        GUILayout.Label("延迟: " + (socket != null ? ((int)(socket.latency * 1000)).ToString() : ""));
        GUILayout.Label("速度: " + gameSpeed);

        if (socket != null)
        {
            // 已发送包
            Packet[] sends = socket.sends.ToArray();
            for (int i = 0; i < sends.Length; i++)
            {
                GUI.color = sends[i].arrived ? Color.green : Color.white;
                GUILayout.Label(sends[i].sequence + " " + sends[i].type);
                GUI.color = Color.white;
            }
            // 已接收包
            GUILayout.BeginArea(new Rect(300, 20, 200, 600));
            Packet[] receives = socket.receives.ToArray();
            for (int i = 0; i < receives.Length; i++)
            {
                GUILayout.Label(receives[i].sequence + " " + receives[i].type);
            }
            GUILayout.EndArea();
        }
    }