public void SendReceiveWithPipelineInParallelJobWorks()
        {
            var timeoutParam = new NetworkConfigParameter
            {
                connectTimeoutMS    = NetworkParameterConstants.ConnectTimeoutMS,
                maxConnectAttempts  = NetworkParameterConstants.MaxConnectAttempts,
                disconnectTimeoutMS = 90 * 1000,
                maxFrameTimeMS      = 16
            };
            NativeArray <NetworkConnection> serverToClient;

            using (var serverDriver = new LocalNetworkDriver(new NetworkDataStreamParameter {
                size = 64
            }, timeoutParam))
                using (var clientDriver0 = new LocalNetworkDriver(new NetworkDataStreamParameter {
                    size = 64
                }, timeoutParam))
                    using (var clientDriver1 = new LocalNetworkDriver(new NetworkDataStreamParameter {
                        size = 64
                    }, timeoutParam))
                        using (serverToClient = new NativeArray <NetworkConnection>(2, Allocator.Persistent))
                        {
                            var serverPipeline = serverDriver.CreatePipeline(typeof(ReliableSequencedPipelineStage));
                            serverDriver.Bind(IPCManager.Instance.CreateEndPoint());
                            serverDriver.Listen();
                            var client0Pipeline = clientDriver0.CreatePipeline(typeof(ReliableSequencedPipelineStage));
                            var client1Pipeline = clientDriver1.CreatePipeline(typeof(ReliableSequencedPipelineStage));
                            var strmWriter      = new DataStreamWriter(4, Allocator.Temp);
                            strmWriter.Write(42);
                            var clientToServer0 = clientDriver0.Connect(serverDriver.LocalEndPoint());
                            var clientToServer1 = clientDriver1.Connect(serverDriver.LocalEndPoint());
                            WaitForConnected(clientDriver0, serverDriver, clientToServer0);
                            serverToClient[0] = serverDriver.Accept();
                            Assert.IsTrue(serverToClient[0].IsCreated);
                            WaitForConnected(clientDriver1, serverDriver, clientToServer1);
                            serverToClient[1] = serverDriver.Accept();
                            Assert.IsTrue(serverToClient[1].IsCreated);
                            clientToServer0.Send(clientDriver0, client0Pipeline, strmWriter);
                            clientToServer1.Send(clientDriver1, client1Pipeline, strmWriter);
                            clientDriver0.ScheduleUpdate().Complete();
                            clientDriver1.ScheduleUpdate().Complete();

                            var sendRecvJob = new SendReceiveWithPipelineParallelJob
                            {
                                driver = serverDriver.ToConcurrent(), connections = serverToClient, pipeline = serverPipeline
                            };
                            var jobHandle = serverDriver.ScheduleUpdate();
                            jobHandle = sendRecvJob.Schedule(serverToClient.Length, 1, jobHandle);
                            serverDriver.ScheduleUpdate(jobHandle).Complete();

                            AssertDataReceived(serverDriver, serverToClient, clientDriver0, clientToServer0, 43, false);
                            AssertDataReceived(serverDriver, serverToClient, clientDriver1, clientToServer1, 43, false);
                        }
        }
Beispiel #2
0
        public void SendReceiveWithPipelineInParallelJobWorks()
        {
            var timeoutParam = new NetworkConfigParameter
            {
                connectTimeoutMS    = NetworkParameterConstants.ConnectTimeoutMS,
                maxConnectAttempts  = NetworkParameterConstants.MaxConnectAttempts,
                disconnectTimeoutMS = 90 * 1000
            };
            var serverDriver = new LocalNetworkDriver(new NetworkDataStreamParameter {
                size = 64
            }, timeoutParam);
            var serverPipeline = serverDriver.CreatePipeline(typeof(UnreliableSequencedPipelineStage));

            serverDriver.Bind(IPCManager.Instance.CreateEndPoint());
            serverDriver.Listen();
            var clientDriver0 = new LocalNetworkDriver(new NetworkDataStreamParameter {
                size = 64
            }, timeoutParam);
            var clientDriver1 = new LocalNetworkDriver(new NetworkDataStreamParameter {
                size = 64
            }, timeoutParam);
            var client0Pipeline = clientDriver0.CreatePipeline(typeof(UnreliableSequencedPipelineStage));
            var client1Pipeline = clientDriver1.CreatePipeline(typeof(UnreliableSequencedPipelineStage));
            var serverToClient  = new NativeArray <NetworkConnection>(2, Allocator.TempJob);
            var strmWriter      = new DataStreamWriter(4, Allocator.Temp);

            strmWriter.Write(42);
            var clientToServer0 = clientDriver0.Connect(serverDriver.LocalEndPoint());
            var clientToServer1 = clientDriver1.Connect(serverDriver.LocalEndPoint());

            WaitForConnected(clientDriver0, serverDriver, clientToServer0);
            serverToClient[0] = serverDriver.Accept();
            Assert.IsTrue(serverToClient[0].IsCreated);
            WaitForConnected(clientDriver1, serverDriver, clientToServer1);
            serverToClient[1] = serverDriver.Accept();
            Assert.IsTrue(serverToClient[1].IsCreated);
            clientToServer0.Send(clientDriver0, client0Pipeline, strmWriter);
            clientToServer1.Send(clientDriver1, client1Pipeline, strmWriter);
            clientDriver0.ScheduleUpdate().Complete();
            clientDriver1.ScheduleUpdate().Complete();

            var sendRecvJob = new SendReceiveWithPipelineParallelJob {
                driver = serverDriver.ToConcurrent(), connections = serverToClient, pipeline = serverPipeline
            };
            var jobHandle = serverDriver.ScheduleUpdate();

            jobHandle = sendRecvJob.Schedule(serverToClient.Length, 1, jobHandle);
            serverDriver.ScheduleUpdate(jobHandle).Complete();

            DataStreamReader strmReader;

            clientDriver0.ScheduleUpdate().Complete();
            Assert.AreEqual(NetworkEvent.Type.Data, clientToServer0.PopEvent(clientDriver0, out strmReader));
            var ctx = default(DataStreamReader.Context);

            Assert.AreEqual(43, strmReader.ReadInt(ref ctx));
            clientDriver1.ScheduleUpdate().Complete();
            Assert.AreEqual(NetworkEvent.Type.Data, clientToServer1.PopEvent(clientDriver1, out strmReader));
            ctx = default(DataStreamReader.Context);
            Assert.AreEqual(43, strmReader.ReadInt(ref ctx));

            serverToClient.Dispose();
            clientDriver0.Dispose();
            clientDriver1.Dispose();
            serverDriver.Dispose();
        }
        public void ParallelSendReceiveStressTest()
        {
            var timeoutParam = new NetworkConfigParameter
            {
                connectTimeoutMS    = NetworkParameterConstants.ConnectTimeoutMS,
                maxConnectAttempts  = NetworkParameterConstants.MaxConnectAttempts,
                disconnectTimeoutMS = 90 * 1000,
                maxFrameTimeMS      = 16
            };
            NativeArray <NetworkConnection> serverToClient;
            var clientDrivers   = new List <LocalNetworkDriver>();
            var clientPipelines = new List <NetworkPipeline>();
            var clientToServer  = new List <NetworkConnection>();

            try
            {
                for (int i = 0; i < 250; ++i)
                {
                    clientDrivers.Add(new LocalNetworkDriver(new NetworkDataStreamParameter {
                        size = 64
                    }, timeoutParam));
                    clientPipelines.Add(clientDrivers[i].CreatePipeline(typeof(ReliableSequencedPipelineStage)));
                }
                using (var serverDriver = new LocalNetworkDriver(new NetworkDataStreamParameter {
                    size = 17 * clientDrivers.Count
                }, timeoutParam))
                    using (serverToClient = new NativeArray <NetworkConnection>(clientDrivers.Count, Allocator.Persistent))
                    {
                        var serverPipeline = serverDriver.CreatePipeline(typeof(ReliableSequencedPipelineStage));
                        serverDriver.Bind(IPCManager.Instance.CreateEndPoint());
                        serverDriver.Listen();
                        var strmWriter = new DataStreamWriter(4, Allocator.Temp);
                        strmWriter.Write(42);
                        for (var i = 0; i < clientDrivers.Count; ++i)
                        {
                            var drv = clientDrivers[i];
                            var con = drv.Connect(serverDriver.LocalEndPoint());
                            WaitForConnected(drv, serverDriver, con);
                            clientToServer.Add(con);
                            serverToClient[i] = serverDriver.Accept();
                            Assert.IsTrue(serverToClient[i].IsCreated);
                        }
                        for (var i = 0; i < clientDrivers.Count; ++i)
                        {
                            clientToServer[i].Send(clientDrivers[i], clientPipelines[i], strmWriter);
                            clientDrivers[i].ScheduleUpdate().Complete();
                        }

                        var sendRecvJob = new SendReceiveWithPipelineParallelJob
                        {
                            driver = serverDriver.ToConcurrent(), connections = serverToClient, pipeline = serverPipeline
                        };
                        var jobHandle = serverDriver.ScheduleUpdate();
                        jobHandle = sendRecvJob.Schedule(serverToClient.Length, 1, jobHandle);
                        serverDriver.ScheduleUpdate(jobHandle).Complete();

                        for (var i = 0; i < clientDrivers.Count; ++i)
                        {
                            AssertDataReceived(serverDriver, serverToClient, clientDrivers[i], clientToServer[i], 43, false);
                        }
                    }
            }
            finally
            {
                foreach (var drv in clientDrivers)
                {
                    drv.Dispose();
                }
            }
        }