3 Commits

5 changed files with 31 additions and 14 deletions

View File

@@ -31,10 +31,10 @@ public class ListPool<T> : IPool<List<T>>
OnReturned?.Invoke(this, list); OnReturned?.Invoke(this, list);
} }
public ListPool(Func<List<T>> generator, int initialCapacity = 1) public ListPool(int initialListCount = 1, int initialListCapacity = 32)
{ {
this.generator = generator; generator = () => new(initialListCapacity);
for (int i = 0; i < initialCapacity; i++) for (int i = 0; i < initialListCount; i++)
queue.Enqueue(generator()); queue.Enqueue(generator());
} }
} }

View File

@@ -1,5 +1,10 @@
namespace Syntriax.Engine.Core; namespace Syntriax.Engine.Core;
/// <summary>
/// Represents an infinite ray in 2D space.
/// </summary>
/// <param name="Origin">The <see cref="Vector2D"/> in 2D space where the ray starts from.</param>
/// <param name="Direction">Normalized <see cref="Vector2D"/> indicating the ray's is direction.</param>
public readonly struct Ray2D(Vector2D Origin, Vector2D Direction) public readonly struct Ray2D(Vector2D Origin, Vector2D Direction)
{ {
/// <summary> /// <summary>

View File

@@ -25,11 +25,11 @@ public class PhysicsEngine2D : Behaviour, IPreUpdate, IPhysicsEngine2D
protected BehaviourCollector<IRigidBody2D> rigidBodyCollector = new(); protected BehaviourCollector<IRigidBody2D> rigidBodyCollector = new();
protected BehaviourCollector<ICollider2D> colliderCollector = new(); protected BehaviourCollector<ICollider2D> colliderCollector = new();
private readonly ListPool<ICollider2D> colliderPool = new(() => new(32)); private readonly ListPool<ICollider2D> colliderPool = new();
private readonly ListPool<IPrePhysicsUpdate> prePhysicsUpdatePool = new(() => new(32)); private readonly ListPool<IPrePhysicsUpdate> prePhysicsUpdatePool = new();
private readonly ListPool<IPhysicsUpdate> physicsUpdatePool = new(() => new(32)); private readonly ListPool<IPhysicsUpdate> physicsUpdatePool = new();
private readonly ListPool<IPhysicsIteration> physicsIterationPool = new(() => new(32)); private readonly ListPool<IPhysicsIteration> physicsIterationPool = new();
private readonly ListPool<IPostPhysicsUpdate> postPhysicsUpdatePool = new(() => new(32)); private readonly ListPool<IPostPhysicsUpdate> postPhysicsUpdatePool = new();
public int IterationPerStep { get => _iterationPerStep; set => _iterationPerStep = value < 1 ? 1 : value; } public int IterationPerStep { get => _iterationPerStep; set => _iterationPerStep = value < 1 ? 1 : value; }
public float IterationPeriod { get => _iterationPeriod; set => _iterationPeriod = value.Max(0.0001f); } public float IterationPeriod { get => _iterationPeriod; set => _iterationPeriod = value.Max(0.0001f); }

View File

@@ -21,6 +21,12 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D
private readonly ICollisionResolver2D collisionResolver = null!; private readonly ICollisionResolver2D collisionResolver = null!;
private readonly IRaycastResolver2D raycastResolver = null!; private readonly IRaycastResolver2D raycastResolver = null!;
private readonly ListPool<ICollider2D> colliderPool = new();
private readonly ListPool<IPrePhysicsUpdate> prePhysicsUpdatePool = new();
private readonly ListPool<IPhysicsUpdate> physicsUpdatePool = new();
private readonly ListPool<IPhysicsIteration> physicsIterationPool = new();
private readonly ListPool<IPostPhysicsUpdate> postPhysicsUpdatePool = new();
public int IterationPerStep { get => _iterationCount; set => _iterationCount = value < 1 ? 1 : value; } public int IterationPerStep { get => _iterationCount; set => _iterationCount = value < 1 ? 1 : value; }
public void AddRigidBody(IRigidBody2D rigidBody) public void AddRigidBody(IRigidBody2D rigidBody)
@@ -112,11 +118,11 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D
{ {
float intervalDeltaTime = deltaTime / IterationPerStep; float intervalDeltaTime = deltaTime / IterationPerStep;
List<ICollider2D> childColliders = []; List<ICollider2D> childColliders = colliderPool.Get();
List<IPrePhysicsUpdate> physicsPreUpdates = []; List<IPrePhysicsUpdate> physicsPreUpdates = prePhysicsUpdatePool.Get();
List<IPhysicsUpdate> physicsUpdates = []; List<IPhysicsUpdate> physicsUpdates = physicsUpdatePool.Get();
List<IPhysicsIteration> physicsIterations = []; List<IPhysicsIteration> physicsIterations = physicsIterationPool.Get();
List<IPostPhysicsUpdate> physicsPostUpdates = []; List<IPostPhysicsUpdate> physicsPostUpdates = postPhysicsUpdatePool.Get();
rigidBody.BehaviourController.GetBehavioursInChildren(childColliders); rigidBody.BehaviourController.GetBehavioursInChildren(childColliders);
rigidBody.BehaviourController.GetBehavioursInChildren(physicsPreUpdates); rigidBody.BehaviourController.GetBehavioursInChildren(physicsPreUpdates);
@@ -160,6 +166,12 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D
for (int i = physicsPostUpdates.Count - 1; i >= 0; i--) for (int i = physicsPostUpdates.Count - 1; i >= 0; i--)
physicsPostUpdates[i].PostPhysicsUpdate(deltaTime); physicsPostUpdates[i].PostPhysicsUpdate(deltaTime);
colliderPool.Return(childColliders);
prePhysicsUpdatePool.Return(physicsPreUpdates);
physicsUpdatePool.Return(physicsUpdates);
physicsIterationPool.Return(physicsIterations);
postPhysicsUpdatePool.Return(physicsPostUpdates);
} }
private void ResolveColliders(ICollider2D colliderX, ICollider2D colliderY) private void ResolveColliders(ICollider2D colliderX, ICollider2D colliderY)

View File

@@ -6,7 +6,7 @@ namespace Syntriax.Engine.Physics2D;
public class RaycastResolver2D : IRaycastResolver2D public class RaycastResolver2D : IRaycastResolver2D
{ {
private readonly ListPool<Line2D> lineCacheQueue = new(() => new(4)); private readonly ListPool<Line2D> lineCacheQueue = new(initialListCapacity: 4);
RaycastResult? IRaycastResolver2D.RaycastAgainst<T>(T shape, Ray2D ray, float length) RaycastResult? IRaycastResolver2D.RaycastAgainst<T>(T shape, Ray2D ray, float length)
{ {