public TimingsRingBuffer(int maximumCapacity) { if (maximumCapacity <= 0) { throw new ArgumentException("Capacity must be positive."); } QuickQueue <double, Array <double> > .Create(new PassthroughArrayPool <double>(), maximumCapacity, out queue); }
public static void TestQueueResizing <TSpan, TPool>(TPool pool) where TSpan : ISpan <int> where TPool : IMemoryPool <int, TSpan> { Random random = new Random(5); QuickQueue <int, TSpan> .Create(pool, 4, out var queue); Queue <int> controlQueue = new Queue <int>(); for (int iterationIndex = 0; iterationIndex < 1000000; ++iterationIndex) { if (random.NextDouble() < 0.7) { queue.Enqueue(iterationIndex, pool); controlQueue.Enqueue(iterationIndex); } if (random.NextDouble() < 0.2) { queue.Dequeue(); controlQueue.Dequeue(); } if (iterationIndex % 1000 == 0) { queue.EnsureCapacity(queue.Count * 3, pool); } else if (iterationIndex % 7777 == 0) { queue.Compact(pool); } } Debug.Assert(queue.Count == controlQueue.Count, "e"); while (queue.Count > 0) { var a = queue.Dequeue(); var b = controlQueue.Dequeue(); Debug.Assert(a == b); Debug.Assert(queue.Count == controlQueue.Count); } queue.Dispose(pool); }
public unsafe override void Initialize(Camera camera) { camera.Position = new Vector3(-3f, 3, -3f); camera.Yaw = MathHelper.Pi * 3f / 4; camera.Pitch = MathHelper.Pi * 0.1f; Simulation = Simulation.Create(BufferPool, new TestCallbacks(), new SimulationAllocationSizes { Bodies = 1, ConstraintCountPerBodyEstimate = 1, Constraints = 1, ConstraintsPerTypeBatch = 1, Islands = 1, ShapesPerType = 1, Statics = 1 }); Simulation.PoseIntegrator.Gravity = new Vector3(0, -10, 0); Simulation.Deterministic = false; var staticShape = new Sphere(6); var staticShapeIndex = Simulation.Shapes.Add(ref staticShape); const int staticGridWidthInSpheres = 128; const float staticSpacing = 8; for (int i = 0; i < staticGridWidthInSpheres; ++i) { for (int j = 0; j < staticGridWidthInSpheres; ++j) { var staticDescription = new StaticDescription { Collidable = new CollidableDescription { Continuity = new ContinuousDetectionSettings { Mode = ContinuousDetectionMode.Discrete }, Shape = staticShapeIndex, SpeculativeMargin = 0.1f }, Pose = new RigidPose { Position = new Vector3( -staticGridWidthInSpheres * staticSpacing * 0.5f + i * staticSpacing, -4 + 4 * (float)Math.Cos(i * 0.3) + 4 * (float)Math.Cos(j * 0.3), -staticGridWidthInSpheres * staticSpacing * 0.5f + j * staticSpacing), Orientation = BepuUtilities.Quaternion.Identity } }; Simulation.Statics.Add(ref staticDescription); } } //A bunch of kinematic balls do acrobatics as an extra stressor. var kinematicShape = new Sphere(8); var kinematicShapeIndex = Simulation.Shapes.Add(ref staticShape); var kinematicCount = 64; var anglePerKinematic = MathHelper.TwoPi / kinematicCount; var startingRadius = 256; kinematicHandles = new int[kinematicCount]; for (int i = 0; i < kinematicCount; ++i) { var angle = anglePerKinematic * i; var description = new BodyDescription { Collidable = new CollidableDescription { Continuity = new ContinuousDetectionSettings { Mode = ContinuousDetectionMode.Discrete }, Shape = kinematicShapeIndex, SpeculativeMargin = 0.1f }, Pose = new RigidPose { Position = new Vector3( startingRadius * (float)Math.Cos(angle), 0, startingRadius * (float)Math.Sin(angle)), Orientation = BepuUtilities.Quaternion.Identity }, Activity = new BodyActivityDescription { DeactivationThreshold = 0, MinimumTimestepCountUnderThreshold = 4 }, }; kinematicHandles[i] = Simulation.Bodies.Add(ref description); } QuickQueue <int, Buffer <int> > .Create(BufferPool.SpecializeFor <int>(), 65536, out dynamicHandles); random = new Random(5); }
public unsafe override void Initialize(ContentArchive content, Camera camera) { camera.Position = new Vector3(-15f, 20, -15f); camera.Yaw = MathHelper.Pi * 3f / 4; camera.Pitch = MathHelper.Pi * 0.1f; //Using minimum sized allocations forces as many resizes as possible. Simulation = Simulation.Create(BufferPool, new TestCallbacks(), new SimulationAllocationSizes { Bodies = 1, ConstraintCountPerBodyEstimate = 1, Constraints = 1, ConstraintsPerTypeBatch = 1, Islands = 1, ShapesPerType = 1, Statics = 1 }); Simulation.PoseIntegrator.Gravity = new Vector3(0, -10, 0); Simulation.Deterministic = false; const int planeWidth = 8; const int planeHeight = 8; MeshDemo.CreateDeformedPlane(planeWidth, planeHeight, (int x, int y) => { Vector2 offsetFromCenter = new Vector2(x - planeWidth / 2, y - planeHeight / 2); return(new Vector3(offsetFromCenter.X, MathF.Cos(x / 4f) * MathF.Sin(y / 4f) - 0.2f * offsetFromCenter.LengthSquared(), offsetFromCenter.Y)); }, new Vector3(2, 1, 2), BufferPool, out var staticShape); var staticShapeIndex = Simulation.Shapes.Add(staticShape); const int staticGridWidthInSpheres = 128; const float staticSpacing = 8; for (int i = 0; i < staticGridWidthInSpheres; ++i) { for (int j = 0; j < staticGridWidthInSpheres; ++j) { var staticDescription = new StaticDescription { Collidable = new CollidableDescription { Continuity = new ContinuousDetectionSettings { Mode = ContinuousDetectionMode.Discrete }, Shape = staticShapeIndex, SpeculativeMargin = 0.1f }, Pose = new RigidPose { Position = new Vector3( -staticGridWidthInSpheres * staticSpacing * 0.5f + i * staticSpacing, -4 + 4 * (float)Math.Cos(i * 0.3) + 4 * (float)Math.Cos(j * 0.3), -staticGridWidthInSpheres * staticSpacing * 0.5f + j * staticSpacing), Orientation = BepuUtilities.Quaternion.Identity } }; Simulation.Statics.Add(staticDescription); } } //A bunch of kinematic balls do acrobatics as an extra stressor. var kinematicShape = new Sphere(8); var kinematicShapeIndex = Simulation.Shapes.Add(kinematicShape); var kinematicCount = 64; var anglePerKinematic = MathHelper.TwoPi / kinematicCount; var startingRadius = 256; kinematicHandles = new int[kinematicCount]; for (int i = 0; i < kinematicCount; ++i) { var angle = anglePerKinematic * i; var description = new BodyDescription { Collidable = new CollidableDescription { Continuity = new ContinuousDetectionSettings { Mode = ContinuousDetectionMode.Discrete }, Shape = kinematicShapeIndex, SpeculativeMargin = 0.1f }, Pose = new RigidPose { Position = new Vector3( startingRadius * (float)Math.Cos(angle), 0, startingRadius * (float)Math.Sin(angle)), Orientation = BepuUtilities.Quaternion.Identity }, Activity = new BodyActivityDescription { SleepThreshold = 0, MinimumTimestepCountUnderThreshold = 4 }, }; kinematicHandles[i] = Simulation.Bodies.Add(description); } QuickQueue <int, Buffer <int> > .Create(BufferPool.SpecializeFor <int>(), 65536, out dynamicHandles); QuickQueue <StaticDescription, Buffer <StaticDescription> > .Create(BufferPool.SpecializeFor <StaticDescription>(), 512, out removedStatics); random = new Random(5); }