/// <summary> /// /// </summary> /// <param name="server"></param> void SendSnapshot ( NetServer server, SnapshotQueue queue, long serverTicks ) { // snapshot request is stored in connection's tag.s var debug = Game.Network.ShowSnapshots; var conns = server.Connections.Where ( c => c.IsSnapshotRequested() ); var sw = new Stopwatch(); foreach ( var conn in conns ) { sw.Reset(); sw.Start(); var frame = queue.LastFrame; var prevFrame = conn.GetRequestedSnapshotID(); int size = 0; var commandID = conn.GetLastCommandID(); var snapshot = queue.Compress( ref prevFrame, out size); // reset snapshot request : conn.ResetRequestSnapshot(); var msg = server.CreateMessage( snapshot.Length + 4 * 4 + 8 + 1 ); msg.Write( (byte)NetCommand.Snapshot ); msg.Write( frame ); msg.Write( prevFrame ); msg.Write( commandID ); msg.Write( serverTicks ); msg.Write( snapshot.Length ); msg.Write( snapshot ); // append atom table to first snapshot : if (commandID==0) { atoms.Write( msg ); } // Zero snapshot frame index means that client is waiting for first snapshot. // and snapshot should reach the client. var delivery = prevFrame == 0 ? NetDeliveryMethod.ReliableOrdered : NetDeliveryMethod.UnreliableSequenced; if (prevFrame==0) { Log.Message("SV: Sending initial snapshot to {0}", conn.GetHailGuid().ToString() ); } sw.Stop(); server.SendMessage( msg, conn, delivery, 0 ); if (debug) { Log.Message("Snapshot: #{0} - #{1} : {2} / {3} to {4} at {5} msec", frame, prevFrame, snapshot.Length, size, conn.RemoteEndPoint.ToString(), sw.Elapsed.TotalMilliseconds ); } } }