split latency from Client into ClientPing

closes #4282
This commit is contained in:
Matthias Mailänder
2014-04-16 19:35:43 +02:00
parent f365f9da2b
commit f68a6bbd76
7 changed files with 99 additions and 20 deletions

View File

@@ -18,6 +18,7 @@ namespace OpenRA.Network
public class Session
{
public List<Client> Clients = new List<Client>();
public List<ClientPing> ClientPings = new List<ClientPing>();
// Keyed by the PlayerReference id that the slot corresponds to
public Dictionary<string, Slot> Slots = new Dictionary<string, Slot>();
@@ -45,6 +46,10 @@ namespace OpenRA.Network
session.Clients.Add(FieldLoader.Load<Client>(y.Value));
break;
case "ClientPing":
session.ClientPings.Add(FieldLoader.Load<ClientPing>(y.Value));
break;
case "Slot":
var s = FieldLoader.Load<Slot>(y.Value);
session.Slots.Add(s.PlayerReference, s);
@@ -107,6 +112,23 @@ namespace OpenRA.Network
public bool IsReady { get { return State == ClientState.Ready; } }
public bool IsInvalid { get { return State == ClientState.Invalid; } }
public bool IsObserver { get { return Slot == null; } }
public string Serialize()
{
var clientData = new List<MiniYamlNode>();
clientData.Add(new MiniYamlNode("Client@{0}".F(this.Index), FieldSaver.Save(this)));
return clientData.WriteToString();
}
}
public ClientPing PingFromClient(Client client)
{
return ClientPings.SingleOrDefault(p => p.Index == client.Index);
}
public class ClientPing
{
public int Index;
public int Latency = -1;
public int LatencyJitter = -1;
public int[] LatencyHistory = { };
@@ -114,7 +136,7 @@ namespace OpenRA.Network
public string Serialize()
{
var clientData = new List<MiniYamlNode>();
clientData.Add(new MiniYamlNode("Client@{0}".F(this.Index), FieldSaver.Save(this)));
clientData.Add(new MiniYamlNode("ClientPing@{0}".F(this.Index), FieldSaver.Save(this)));
return clientData.WriteToString();
}
}
@@ -174,6 +196,9 @@ namespace OpenRA.Network
foreach (var client in Clients)
sessionData.Append(client.Serialize());
foreach (var clientPing in ClientPings)
sessionData.Append(clientPing.Serialize());
foreach (var slot in Slots)
sessionData.Append(slot.Value.Serialize());

View File

@@ -218,6 +218,21 @@ namespace OpenRA.Network
break;
}
case "SyncClientPings":
{
var pings = new List<Session.ClientPing>();
var nodes = MiniYaml.FromString(order.TargetString);
foreach (var node in nodes)
{
var strings = node.Key.Split('@');
if (strings[0] == "ClientPing")
pings.Add(FieldLoader.Load<Session.ClientPing>(node.Value));
}
orderManager.LobbyInfo.ClientPings = pings;
break;
}
case "SetStance":
{
if (!Game.orderManager.LobbyInfo.GlobalSettings.FragileAlliances)

View File

@@ -322,6 +322,9 @@ namespace OpenRA.Server
PreConns.Remove(newConn);
Conns.Add(newConn);
LobbyInfo.Clients.Add(client);
var clientPing = new Session.ClientPing();
clientPing.Index = client.Index;
LobbyInfo.ClientPings.Add(clientPing);
Log.Write("server", "Client {0}: Accepted connection from {1}.",
newConn.PlayerIndex, newConn.socket.RemoteEndPoint);
@@ -442,6 +445,7 @@ namespace OpenRA.Server
switch (so.Name)
{
case "Command":
{
bool handled = false;
foreach (var t in serverTraits.WithInterface<IInterpretCommand>())
if (handled = t.InterpretCommand(this, conn, GetClient(conn), so.Data))
@@ -454,7 +458,7 @@ namespace OpenRA.Server
}
break;
}
case "HandshakeResponse":
ValidateClient(conn, so.Data);
break;
@@ -472,20 +476,22 @@ namespace OpenRA.Server
break;
}
var fromClient = GetClient(conn);
var history = fromClient.LatencyHistory.ToList();
var pingFromClient = LobbyInfo.PingFromClient(GetClient(conn));
if (pingFromClient == null)
return;
var history = pingFromClient.LatencyHistory.ToList();
history.Add(Environment.TickCount - pingSent);
// Cap ping history at 5 values (25 seconds)
if (history.Count > 5)
history.RemoveRange(0, history.Count - 5);
fromClient.Latency = history.Sum() / history.Count;
fromClient.LatencyJitter = (history.Max() - history.Min()) / 2;
fromClient.LatencyHistory = history.ToArray();
pingFromClient.Latency = history.Sum() / history.Count;
pingFromClient.LatencyJitter = (history.Max() - history.Min()) / 2;
pingFromClient.LatencyHistory = history.ToArray();
if (State == ServerState.WaitingPlayers)
SyncLobbyClients(); // TODO: SyncClientLatency
SyncClientPing();
break;
}
@@ -614,6 +620,19 @@ namespace OpenRA.Server
t.LobbyInfoSynced(this);
}
public void SyncClientPing()
{
var clientPings = new System.Text.StringBuilder();
foreach (var ping in LobbyInfo.ClientPings)
clientPings.Append(ping.Serialize());
DispatchOrders(null, 0,
new ServerOrder("SyncClientPings", clientPings.ToString()).Serialize());
foreach (var t in serverTraits.WithInterface<INotifySyncLobbyInfo>())
t.LobbyInfoSynced(this);
}
public void StartGame()
{
listener.Stop();