diff --git a/Engine.Physics2D/PhysicsEngine2DStandalone.cs b/Engine.Physics2D/PhysicsEngine2DStandalone.cs index dc16d4c..5998f04 100644 --- a/Engine.Physics2D/PhysicsEngine2DStandalone.cs +++ b/Engine.Physics2D/PhysicsEngine2DStandalone.cs @@ -21,6 +21,12 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D private readonly ICollisionResolver2D collisionResolver = null!; private readonly IRaycastResolver2D raycastResolver = null!; + private readonly ListPool colliderPool = new(() => new(32)); + private readonly ListPool prePhysicsUpdatePool = new(() => new(32)); + private readonly ListPool physicsUpdatePool = new(() => new(32)); + private readonly ListPool physicsIterationPool = new(() => new(32)); + private readonly ListPool postPhysicsUpdatePool = new(() => new(32)); + public int IterationPerStep { get => _iterationCount; set => _iterationCount = value < 1 ? 1 : value; } public void AddRigidBody(IRigidBody2D rigidBody) @@ -112,11 +118,11 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D { float intervalDeltaTime = deltaTime / IterationPerStep; - List childColliders = []; - List physicsPreUpdates = []; - List physicsUpdates = []; - List physicsIterations = []; - List physicsPostUpdates = []; + List childColliders = colliderPool.Get(); + List physicsPreUpdates = prePhysicsUpdatePool.Get(); + List physicsUpdates = physicsUpdatePool.Get(); + List physicsIterations = physicsIterationPool.Get(); + List physicsPostUpdates = postPhysicsUpdatePool.Get(); rigidBody.BehaviourController.GetBehavioursInChildren(childColliders); rigidBody.BehaviourController.GetBehavioursInChildren(physicsPreUpdates); @@ -160,6 +166,12 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D for (int i = physicsPostUpdates.Count - 1; i >= 0; i--) 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)