// Use this for initialization void Start() { PacketQueue.GetInstance().packetLoss = PacketLoss; MessageHandler = new ServerMessageHandler(this); Thread thread = new Thread(new ThreadStart(ThreadMethod)); thread.Start(); SimulateConnections(); }
// Update is called once per frame void Update() { time += Time.deltaTime; acumTime += Time.deltaTime; if (acumTime >= (1.0f / fps)) { frame++; acumTime -= (1.0f / fps); Packet packet = PacketQueue.GetInstance().PollPacket(); while (packet != null) { foreach (var gm in packet.Messages) { handler.Handle(gm); } packet = PacketQueue.GetInstance().PollPacket(); } foreach (var action in player.toSend) { outgoingMessages.Add(action); } player.toSend.Clear(); foreach (var gm in outgoingMessages) { if (gm.isReliable()) { if (MessageType.PlayerInput.Equals(gm.type())) { rq.AddQueueWithOutTimeout((ReliableMessage)gm); } else { rq.AddQueueWithTimeout((ReliableMessage)gm, time); } } } Dictionary <int, PlayerSnapshot> currentSnapshot = SnapshotHandler.GetInstance().getSnapshot(time); if (currentSnapshot != null) { SnapshotHandler.GetInstance().updatePlayer(currentSnapshot); } outgoingMessages.AddRange(rq.MessageToResend(time)); Debug.Log("Outgoing messages size: " + outgoingMessages.Count); if (outgoingMessages.Count > 0) { Packet p = new Packet(outgoingMessages); byte[] bytes = p.serialize(); SendUdp(bytes); outgoingMessages.Clear(); } } }
private void ThreadMethod() { UdpClient udpClient = new UdpClient(listenPort); while (true) { IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint); lock (lockObject) { PacketQueue.GetInstance().PushPacket(new Packet(receiveBytes, null)); } } }
// Update is called once per frame void Update() { time += Time.deltaTime; acumTime += Time.deltaTime; inputTime += Time.deltaTime; Packet packet = PacketQueue.GetInstance().PollPacket(); while (packet != null) { ProcessPacket(packet); packet = PacketQueue.GetInstance().PollPacket(); } SendReliableMessages(); SerializeWorld(); for (int i = 1; i < idCount; i++) { UpdatePlayer(i, 1.0f / GlobalSettings.Fps); if (i <= GlobalSettings.AIPlayers) { AI.act(players[i]); } } if (acumTime >= (1.0f / snapRate) && players.Count != 0) { while (acumTime > (1.0f / snapRate)) { acumTime -= (1.0f / snapRate); } byte[] serializedWorld = SerializeWorld(); foreach (Connection connection in connections.Keys) { if (connections[connection] > GlobalSettings.AIPlayers) { SendUdp(SourcePort, connection.srcIp.ToString(), GlobalSettings.GamePort, serializedWorld); } } } }
private void ThreadMethod() { UdpClient udpClient = new UdpClient(listenPort); while (true) { IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint); Connection connection = new Connection(RemoteIpEndPoint.Address, RemoteIpEndPoint.Port); lock (lockObject) { data = (byte[])receiveBytes.Clone(); PacketQueue.GetInstance().PushPacket(new Packet(data, connection)); } } }