private async Task ChannelUpdates(object channelIndexObject) { int channel = (int)channelIndexObject; Stopwatch sw = new Stopwatch(); Stopwatch sw2 = new Stopwatch(); while (true) { sw.Restart(); using (var cpd = await channelPlayerData.WaitAsync()) { sw2.Restart(); int count = Math.Max(1, cpd.Value[channel].Count); Parallel.ForEach(cpd.Value[channel], new ParallelOptions { MaxDegreeOfParallelism = count }, player => { foreach (var otherPlayer in cpd.Value[channel]) { PlayerTelemetry t = otherPlayer.playerData.telemetry; t.pid = otherPlayer.playerData.id; player.client.QueueSend(new NetworkDataTelemetry(t)); } }); Console.WriteLine($"frame time {sw2.ElapsedMilliseconds} ms, players {cpd.Value[channel].Count}"); } //Console.WriteLine($"server fps {1000.0f/(sw.ElapsedMilliseconds==0?1:sw.ElapsedMilliseconds)}"); await Task.Delay((int)Math.Max(20f, tickTime - sw.ElapsedMilliseconds)); } }
public NetworkDataTelemetry(PlayerTelemetry pt) : base(8 * 4, NetworkCode.Telemetry) { this.pid = pt.pid; this.px = pt.px; this.py = pt.py; this.pz = pt.pz; this.qx = pt.qx; this.qy = pt.qy; this.qz = pt.qz; this.qw = pt.qw; }
protected override NetworkData ParseData(byte[] data) { PlayerTelemetry pt = new PlayerTelemetry(); string name; int channel; int index = ReadInt(data, 0, out pt.pid); index = ReadInt(data, index, out channel); index = ReadString(data, index, out name); index = ReadFloat(data, index, out pt.px); index = ReadFloat(data, index, out pt.py); index = ReadFloat(data, index, out pt.pz); index = ReadFloat(data, index, out pt.qx); index = ReadFloat(data, index, out pt.qy); index = ReadFloat(data, index, out pt.qz); index = ReadFloat(data, index, out pt.qw); return(new NetworkDataPlayerInfo(new PlayerData() { channel = channel, id = pt.pid, name = name, telemetry = pt })); }