DifferentPoolSizeCollision.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using BenchmarkDotNet.Attributes;
  2. using BenchmarkDotNet.Engines;
  3. using Microsoft.Xna.Framework;
  4. using MonoGame.Extended.Collisions;
  5. using MonoGame.Extended.Collisions.Layers;
  6. using MonoGame.Extended.Collisions.QuadTree;
  7. namespace MonoGame.Extended.Benchmarks.Collisions;
  8. [SimpleJob(RunStrategy.ColdStart, launchCount:3)]
  9. public class DifferentPoolSizeCollision
  10. {
  11. private const int COMPONENT_BOUNDARY_SIZE = 1000;
  12. private readonly CollisionComponent _collisionComponent;
  13. private readonly Random _random = new Random();
  14. private readonly GameTime _gameTime = new GameTime(TimeSpan.Zero, TimeSpan.FromMilliseconds(16));
  15. public DifferentPoolSizeCollision()
  16. {
  17. var size = new Size2(COMPONENT_BOUNDARY_SIZE, COMPONENT_BOUNDARY_SIZE);
  18. _collisionComponent = new CollisionComponent(new RectangleF(Point2.Zero, size));
  19. }
  20. class Collider: ICollisionActor
  21. {
  22. public Collider(Point2 position)
  23. {
  24. Bounds = new RectangleF(position, new Size2(1, 1));
  25. }
  26. public IShapeF Bounds { get; set; }
  27. public Vector2 Shift { get; set; }
  28. public Point2 Position {
  29. get => Bounds.Position;
  30. set => Bounds.Position = value;
  31. }
  32. public void OnCollision(CollisionEventArgs collisionInfo)
  33. {
  34. }
  35. }
  36. [Params(100, 500, 1000)]
  37. public int N { get; set; }
  38. [Params(1, 2)]
  39. public int LayersCount { get; set; }
  40. public int UpdateCount { get; set; } = 100;
  41. private List<Collider> _colliders = new();
  42. private List<Layer> _layers = new();
  43. [GlobalSetup]
  44. public void GlobalSetup()
  45. {
  46. if (LayersCount > 1)
  47. {
  48. for (int i = 0; i < LayersCount; i++)
  49. {
  50. var size = new Size2(COMPONENT_BOUNDARY_SIZE, COMPONENT_BOUNDARY_SIZE);
  51. var layer = new Layer(new SpatialHash(new Size2(5, 5)));//new QuadTreeSpace(new RectangleF(Point2.Zero, size)))));
  52. _collisionComponent.Add(i.ToString(), layer);
  53. _layers.Add(layer);
  54. }
  55. for (int i = 0; i < LayersCount - 1; i++)
  56. _collisionComponent.AddCollisionBetweenLayer(_layers[i], _layers[i + 1]);
  57. }
  58. for (int i = 0; i < N; i++)
  59. {
  60. var layer = LayersCount == 1
  61. ? _collisionComponent.Layers.First().Value
  62. : _layers[i % LayersCount];
  63. var collider = new Collider(new Point2(
  64. _random.Next(COMPONENT_BOUNDARY_SIZE),
  65. _random.Next(COMPONENT_BOUNDARY_SIZE)))
  66. {
  67. Shift = new Vector2(
  68. _random.Next(4) - 2,
  69. _random.Next(4) - 2),
  70. };
  71. _colliders.Add(collider);
  72. layer.Space.Insert(collider);
  73. }
  74. }
  75. [GlobalCleanup]
  76. public void GlobalCleanup()
  77. {
  78. foreach (var collider in _colliders)
  79. _collisionComponent.Remove(collider);
  80. _colliders.Clear();
  81. foreach (var layer in _layers)
  82. _collisionComponent.Remove(layer: layer);
  83. _layers.Clear();
  84. }
  85. [Benchmark]
  86. public void Benchmark()
  87. {
  88. for (int i = 0; i < UpdateCount; i++)
  89. {
  90. foreach (var collider in _colliders)
  91. collider.Position += collider.Shift;
  92. //_collisionComponent.Update(_gameTime);
  93. }
  94. }
  95. }