public void UpdateWorld(float DeltaTime) { //Poll User Input from the server window ProcessInput(ApplicationWindow.Focused, DeltaTime); //Manage all client connections and their player characters ConnectionManager.CheckClients(DeltaTime); ConnectionManager.CleanDeadClients(World); ConnectionManager.AddNewClients(World); ConnectionManager.UpdateClientPositions(World); ConnectionManager.RespawnDeadPlayers(World); //Track current inhabitants of the PVP Battle Arena, then process the players PVP attacks List <CharacterData> InGameCharacters = ClientSubsetFinder.GetInGameCharacters(); PVPBattleArena.UpdateArenaInhabitants(InGameCharacters); PVPBattleArena.AlertTravellers(); ConnectionManager.PerformPlayerAttacks(World); //Update the packet queue, transmitting all messages to the client connections PacketQueue.UpdateQueue(DeltaTime, TransmitPackets); //Update the physics simulation World.Timestep(DeltaTime, ThreadDispatcher); TimeSamples.RecordFrame(World); }
public static void Test() { const int width = 32; const int height = 32; const int length = 32; SimulationSetup.BuildLattice( new RegularGridWithKinematicBaseBuilder(new Vector3(1), new Vector3()), new BallSocketConstraintBuilder(), width, height, length, out var simulation, out var bodyHandles, out var constraintHandles); var threadDispatcher = new SimpleThreadDispatcher(8); const float inverseDt = 60f; const float dt = 1 / inverseDt; const int iterationCount = 8; const int frameCount = 128; simulation.Solver.IterationCount = iterationCount; simulation.PoseIntegrator.Gravity = new Vector3(0, -10, 0); var samples = new SimulationTimeSamples(frameCount); for (int frameIndex = 0; frameIndex < frameCount; ++frameIndex) { var energyBefore = TestHelpers.GetBodyEnergyHeuristic(simulation.Bodies); //simulation.Timestep(dt); simulation.Timestep(dt, threadDispatcher); samples.RecordFrame(simulation); var energyAfter = TestHelpers.GetBodyEnergyHeuristic(simulation.Bodies); int sampledBodyIndex = width; var samplePose = simulation.Bodies.ActiveSet.Poses[sampledBodyIndex]; var sampleVelocity = simulation.Bodies.ActiveSet.Velocities[sampledBodyIndex]; //for (int i =0; i < simulation.Bodies.BodyCount; ++i) //{ // simulation.Bodies.GetPose(simulation.Bodies.IndexToHandle[i], out var pose); // simulation.Bodies.GetVelocity(simulation.Bodies.IndexToHandle[i], out var velocity); // Console.WriteLine($"Sample {i} position: {pose.Position}, velocity: {velocity.Linear}"); //} Console.WriteLine($"Sample {sampledBodyIndex} position: {samplePose.Position}, velocity: {sampleVelocity.Linear}"); Console.WriteLine($"Body energy {frameIndex}: {energyAfter}, delta: {energyAfter - energyBefore}"); } var multiplier = 1e3 / frameCount; Console.WriteLine($"Simulation time (ms): {multiplier * samples.Simulation.ComputeStats().Total}"); Console.WriteLine($"Body opt time (ms): {multiplier * samples.BodyOptimizer.ComputeStats().Total}"); Console.WriteLine($"Constraint opt time (ms): {multiplier * samples.ConstraintOptimizer.ComputeStats().Total}"); Console.WriteLine($"Batch compress time (ms): {multiplier * samples.BatchCompressor.ComputeStats().Total}"); Console.WriteLine($"Pose integrate time (ms): {multiplier * samples.PoseIntegrator.ComputeStats().Total}"); Console.WriteLine($"Solve time (ms): {multiplier * samples.Solver.ComputeStats().Total}"); threadDispatcher.Dispose(); simulation.BufferPool.Clear(); }
public static SimulationTimeSamples Solve <TBodyBuilder, TConstraintBuilder, TConstraint>(TBodyBuilder bodyBuilder, TConstraintBuilder constraintBuilder, int width, int height, int length, int frameCount, int threadCount, IThreadDispatcher initializationThreadPool, IThreadDispatcher threadDispatcher) where TBodyBuilder : IBodyBuilder where TConstraintBuilder : IConstraintBuilder where TConstraint : IConstraintDescription <TConstraint> { //const int bodyCount = 8; //SimulationSetup.BuildStackOfBodiesOnGround(bodyCount, false, true, out var bodies, out var solver, out var graph, out var bodyHandles, out var constraintHandles); GC.Collect(3, GCCollectionMode.Forced, true); SimulationSetup.BuildLattice( bodyBuilder, constraintBuilder, width, height, length, out var simulation, out var bodyHandles, out var constraintHandles); SimulationScrambling.ScrambleBodies(simulation); SimulationScrambling.ScrambleConstraints(simulation.Solver); SimulationScrambling.ScrambleBodyConstraintLists(simulation); SimulationScrambling.AddRemoveChurn <TConstraint>(simulation, bodyHandles.Length * 2, bodyHandles, constraintHandles); const int batchCompressionIterations = 1000; simulation.SolverBatchCompressor.TargetCandidateFraction = .005f; simulation.SolverBatchCompressor.MaximumCompressionFraction = 0.0005f; for (int i = 0; i < batchCompressionIterations; ++i) { simulation.SolverBatchCompressor.Compress(simulation.BufferPool, initializationThreadPool); } //Attempt cache optimization. int bodyOptimizationIterations = bodyHandles.Length / 4; simulation.BodyLayoutOptimizer.OptimizationFraction = 0.005f; for (int i = 0; i < bodyOptimizationIterations; ++i) { simulation.BodyLayoutOptimizer.IncrementalOptimize(simulation.BufferPool, initializationThreadPool); } simulation.ConstraintLayoutOptimizer.OptimizationFraction = 0.044f; int constraintOptimizationIterations = 1024; for (int i = 0; i < constraintOptimizationIterations; ++i) { simulation.ConstraintLayoutOptimizer.Update(simulation.BufferPool, initializationThreadPool); } var simulationTimeSamples = new SimulationTimeSamples(frameCount); const float dt = 1 / 60f; const int iterationCount = 8; simulation.Solver.IterationCount = iterationCount; for (int frameIndex = 0; frameIndex < frameCount; ++frameIndex) { CacheBlaster.Blast(); simulation.Timestep(dt, threadDispatcher); simulationTimeSamples.RecordFrame(simulation); } simulation.Dispose(); simulation.BufferPool.Clear(); return(simulationTimeSamples); }