public static unsafe void GatherReliabilityStats(ref SoakStatisticsPoint stats, ref SoakStatisticsPoint lastStats, NetworkDriver driver, NetworkPipeline pipeline, NetworkPipelineStageId reliableStageId, NetworkConnection con, long timestamp) { driver.GetPipelineBuffers(pipeline, reliableStageId, con, out var receiveBuffer, out var sendBuffer, out var sharedBuffer); var sharedCtx = (ReliableUtility.SharedContext *)sharedBuffer.GetUnsafeReadOnlyPtr(); stats.ReliableSent += sharedCtx->stats.PacketsSent - lastStats.ReliableSent; //Console.WriteLine("sharedCtx->stats.PacketsSent=" + sharedCtx->stats.PacketsSent + " lastStats.ReliableSent=" + lastStats.ReliableSent + " stats.ReliableSent=" + stats.ReliableSent); stats.ReliableResent += sharedCtx->stats.PacketsResent - lastStats.ReliableResent; stats.ReliableDropped += sharedCtx->stats.PacketsDropped - lastStats.ReliableDropped; stats.ReliableReceived += sharedCtx->stats.PacketsReceived - lastStats.ReliableReceived; stats.ReliableDuplicate += sharedCtx->stats.PacketsDuplicated - lastStats.ReliableDuplicate; stats.ReliableRTT = sharedCtx->RttInfo.LastRtt; stats.ReliableSRTT = sharedCtx->RttInfo.SmoothedRtt; int resendQueueSize = 0; int oldestResendPacketAge = 0; int maxRtt = 0; int maxProcessingTime = 0; GatherExtraStats(sendBuffer, sharedBuffer, timestamp, ref resendQueueSize, ref oldestResendPacketAge, ref maxRtt, ref maxProcessingTime); stats.ReliableResendQueue = resendQueueSize; stats.ReliableOldestResendPacketAge = oldestResendPacketAge; stats.ReliableMaxRTT = maxRtt; stats.ReliableMaxProcessingTime = maxProcessingTime; lastStats.ReliableSent = sharedCtx->stats.PacketsSent; lastStats.ReliableResent = sharedCtx->stats.PacketsResent; lastStats.ReliableDropped = sharedCtx->stats.PacketsDropped; lastStats.ReliableReceived = sharedCtx->stats.PacketsReceived; lastStats.ReliableDuplicate = sharedCtx->stats.PacketsDuplicated; }
public SoakStatisticsPoint Sample() { var sample = SoakStatisticsHandle[0]; SoakStatisticsHandle[0] = new SoakStatisticsPoint(); sample.PingTimeMean = sample.PingTimeMean / sample.PingTimeMeanCount; return(sample); }
public SoakClient(double sendInterval, int packetSize, int duration) { DriverHandle = NetworkDriver.Create( new SimulatorUtility.Parameters { MaxPacketSize = packetSize, MaxPacketCount = 30, PacketDelayMs = 25, PacketDropPercentage = 10 /*PacketDropInterval = 100*/ }, new ReliableUtility.Parameters { WindowSize = 32 }); //Pipeline = DriverHandle.CreatePipeline(typeof(UnreliableSequencedPipelineStage), typeof(SimulatorPipelineStage)); Pipeline = DriverHandle.CreatePipeline(typeof(ReliableSequencedPipelineStage), typeof(SimulatorPipelineStage)); ReliableStageId = NetworkPipelineStageCollection.GetStageId(typeof(ReliableSequencedPipelineStage)); SimulatorStageId = NetworkPipelineStageCollection.GetStageId(typeof(SimulatorPipelineStage)); if (packetSize > NetworkParameterConstants.MTU) { Debug.LogWarning("Truncating packet size to MTU"); packetSize = NetworkParameterConstants.MTU; } else if (packetSize < SoakMessage.HeaderLength) { Debug.LogWarning("Packet size was to small resizing to at least SoakMessage HeaderSize"); packetSize = SoakMessage.HeaderLength; } var payloadSize = packetSize - SoakMessage.HeaderLength; PendingSoakMessages = new NativeArray <SoakMessage>(64, Allocator.Persistent); ConnectionHandle = new NativeArray <NetworkConnection>(1, Allocator.Persistent); SoakJobDataPacket = new NativeArray <byte>(payloadSize, Allocator.Persistent); var random = new byte[payloadSize]; Random r = new Random(); r.NextBytes(random); SoakJobDataPacket.CopyFrom(random); SoakJobContextsHandle = new NativeArray <SoakJobContext>(1, Allocator.Persistent); var context = new SoakJobContext { Duration = duration, PacketSize = packetSize, SendInterval = sendInterval }; SoakJobContextsHandle[0] = context; SoakStatisticsHandle = new NativeArray <SoakStatisticsPoint>(2, Allocator.Persistent); SoakStatisticsHandle[0] = new SoakStatisticsPoint(); SoakStatisticsHandle[1] = new SoakStatisticsPoint(); }
public unsafe void SendPacket(ref SoakStatisticsPoint stats, ref SoakJobContext ctx) { var message = new SoakMessage { id = ctx.FrameId, time = fixedTime, sequence = ctx.NextSequenceNumber++, length = packetData.Length }; var streamWriter = driver.BeginSend(pipeline, connection[0]); streamWriter.WriteBytes(message.data, SoakMessage.HeaderLength); streamWriter.WriteBytes((byte *)packetData.GetUnsafeReadOnlyPtr(), packetData.Length); stats.SentBytes += driver.EndSend(streamWriter); stats.SentPackets++; pendingSoaks[message.id % pendingSoaks.Length] = message; }
public SoakClient(double sendInterval, int packetSize, int duration) { DriverHandle = new UdpCNetworkDriver(new INetworkParameter[0]); if (packetSize > NetworkParameterConstants.MTU) { Debug.LogWarning("Trunkating packet size to MTU"); packetSize = NetworkParameterConstants.MTU; } else if (packetSize < SoakMessage.HeaderLength) { Debug.LogWarning("Packet size was to small resizing to at least SoakMessage HeaderSize"); packetSize = SoakMessage.HeaderLength; } var payloadSize = packetSize - SoakMessage.HeaderLength; SoakClientStreamWriter = new DataStreamWriter(packetSize, Allocator.Persistent); PendingSoakMessages = new NativeArray <SoakMessage>(64, Allocator.Persistent); ConnectionHandle = new NativeArray <NetworkConnection>(1, Allocator.Persistent); SoakJobDataPacket = new NativeArray <byte>(payloadSize, Allocator.Persistent); var random = new byte[payloadSize]; Random r = new Random(); r.NextBytes(random); SoakJobDataPacket.CopyFrom(random); SoakJobContextsHandle = new NativeArray <SoakJobContext>(1, Allocator.Persistent); var context = new SoakJobContext { Duration = duration, PacketSize = packetSize, SendInterval = sendInterval }; SoakJobContextsHandle[0] = context; SoakStatisticsHandle = new NativeArray <SoakStatisticsPoint>(1, Allocator.Persistent); SoakStatisticsHandle[0] = new SoakStatisticsPoint(); }
public void AddSample(SoakStatisticsPoint point, float now) { point.Timestamp = now; Samples.Add(point); }