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); } }
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(); } } }