summaryrefslogtreecommitdiff
path: root/Plugins/MonoGame.Extended/benchmarks/MonoGame.Extended.Benchmarks.Collisions/DifferentPoolSizeCollision.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Plugins/MonoGame.Extended/benchmarks/MonoGame.Extended.Benchmarks.Collisions/DifferentPoolSizeCollision.cs')
-rw-r--r--Plugins/MonoGame.Extended/benchmarks/MonoGame.Extended.Benchmarks.Collisions/DifferentPoolSizeCollision.cs115
1 files changed, 115 insertions, 0 deletions
diff --git a/Plugins/MonoGame.Extended/benchmarks/MonoGame.Extended.Benchmarks.Collisions/DifferentPoolSizeCollision.cs b/Plugins/MonoGame.Extended/benchmarks/MonoGame.Extended.Benchmarks.Collisions/DifferentPoolSizeCollision.cs
new file mode 100644
index 0000000..a4ac858
--- /dev/null
+++ b/Plugins/MonoGame.Extended/benchmarks/MonoGame.Extended.Benchmarks.Collisions/DifferentPoolSizeCollision.cs
@@ -0,0 +1,115 @@
+using BenchmarkDotNet.Attributes;
+using BenchmarkDotNet.Engines;
+using Microsoft.Xna.Framework;
+using MonoGame.Extended.Collisions;
+using MonoGame.Extended.Collisions.Layers;
+using MonoGame.Extended.Collisions.QuadTree;
+
+namespace MonoGame.Extended.Benchmarks.Collisions;
+
+[SimpleJob(RunStrategy.ColdStart, launchCount:3)]
+public class DifferentPoolSizeCollision
+{
+ private const int COMPONENT_BOUNDARY_SIZE = 1000;
+
+ private readonly CollisionComponent _collisionComponent;
+ private readonly Random _random = new Random();
+ private readonly GameTime _gameTime = new GameTime(TimeSpan.Zero, TimeSpan.FromMilliseconds(16));
+
+ public DifferentPoolSizeCollision()
+ {
+ var size = new Size2(COMPONENT_BOUNDARY_SIZE, COMPONENT_BOUNDARY_SIZE);
+ _collisionComponent = new CollisionComponent(new RectangleF(Point2.Zero, size));
+ }
+
+ class Collider: ICollisionActor
+ {
+ public Collider(Point2 position)
+ {
+ Bounds = new RectangleF(position, new Size2(1, 1));
+ }
+
+ public IShapeF Bounds { get; set; }
+ public Vector2 Shift { get; set; }
+
+ public Point2 Position {
+ get => Bounds.Position;
+ set => Bounds.Position = value;
+ }
+
+ public void OnCollision(CollisionEventArgs collisionInfo)
+ {
+ }
+ }
+
+ [Params(100, 500, 1000)]
+ public int N { get; set; }
+
+
+ [Params(1, 2)]
+ public int LayersCount { get; set; }
+
+ public int UpdateCount { get; set; } = 100;
+
+
+ private List<Collider> _colliders = new();
+ private List<Layer> _layers = new();
+
+ [GlobalSetup]
+ public void GlobalSetup()
+ {
+ if (LayersCount > 1)
+ {
+ for (int i = 0; i < LayersCount; i++)
+ {
+ var size = new Size2(COMPONENT_BOUNDARY_SIZE, COMPONENT_BOUNDARY_SIZE);
+ var layer = new Layer(new SpatialHash(new Size2(5, 5)));//new QuadTreeSpace(new RectangleF(Point2.Zero, size)))));
+ _collisionComponent.Add(i.ToString(), layer);
+ _layers.Add(layer);
+ }
+ for (int i = 0; i < LayersCount - 1; i++)
+ _collisionComponent.AddCollisionBetweenLayer(_layers[i], _layers[i + 1]);
+
+ }
+
+ for (int i = 0; i < N; i++)
+ {
+ var layer = LayersCount == 1
+ ? _collisionComponent.Layers.First().Value
+ : _layers[i % LayersCount];
+
+ var collider = new Collider(new Point2(
+ _random.Next(COMPONENT_BOUNDARY_SIZE),
+ _random.Next(COMPONENT_BOUNDARY_SIZE)))
+ {
+ Shift = new Vector2(
+ _random.Next(4) - 2,
+ _random.Next(4) - 2),
+ };
+ _colliders.Add(collider);
+ layer.Space.Insert(collider);
+ }
+ }
+
+ [GlobalCleanup]
+ public void GlobalCleanup()
+ {
+ foreach (var collider in _colliders)
+ _collisionComponent.Remove(collider);
+ _colliders.Clear();
+ foreach (var layer in _layers)
+ _collisionComponent.Remove(layer: layer);
+ _layers.Clear();
+ }
+
+ [Benchmark]
+ public void Benchmark()
+ {
+ for (int i = 0; i < UpdateCount; i++)
+ {
+ foreach (var collider in _colliders)
+ collider.Position += collider.Shift;
+ //_collisionComponent.Update(_gameTime);
+ }
+ }
+}