Пример #1
0
    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;
    }
Пример #2
0
    public SoakStatisticsPoint Sample()
    {
        var sample = SoakStatisticsHandle[0];

        SoakStatisticsHandle[0] = new SoakStatisticsPoint();
        sample.PingTimeMean     = sample.PingTimeMean / sample.PingTimeMeanCount;
        return(sample);
    }
Пример #3
0
    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();
    }
Пример #4
0
    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;
    }
Пример #5
0
    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();
    }
Пример #6
0
 public void AddSample(SoakStatisticsPoint point, float now)
 {
     point.Timestamp = now;
     Samples.Add(point);
 }