public void Dispose()
        {
            this.StandardCleanup();

            if (_solverPool != null)
            {
                _solverPool.Dispose();
                _solverPool = null;
            }

            if (_parallelSolver != null)
            {
                _parallelSolver.Dispose();
                _parallelSolver = null;
            }
        }
        //Dispose of components and clean up
        public override void Dispose()
        {
            if (_disposing)
            {
                return;
            }

            //Unregister all registered rigidbodies
            foreach (var rb in _bulletRigidBodies)
            {
                _dynamicsWorld.RemoveRigidBody(rb);
            }

            //Find all constraints and tell them to dispose
            var constraints = (BulletConstraint[])Object.FindObjectsOfType(typeof(BulletConstraint));

            if (constraints.Length == 0)
            {
                return;
            }
            foreach (var tc in constraints)
            {
                tc.Dispose();
            }

            //Find all Bullet rigidbody instances and tell them to dispose
            var rigidBodies = (BulletRigidBody[])Object.FindObjectsOfType(typeof(BulletRigidBody));

            if (rigidBodies.Length == 0)
            {
                return;
            }
            foreach (var rb in rigidBodies)
            {
                rb.Dispose();
            }

            //Dispose of the physics world components in reverse order
            _disposing = true;
            _dynamicsWorld.Dispose();
            _constraintSolver?.Dispose();
            _broadphaseInterface.Dispose();
            _collisionDispatcher.Dispose();
            _collisionConfig.Dispose();
            _bulletBehaviors.Clear();
            _threadedSolver?.Dispose();
        }