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

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

            if (_parallelSolver != null)
            {
                _parallelSolver.Dispose();
                _parallelSolver = null;
            }
        }
        public MultiThreadedDemoSimulation()
        {
            CreateSchedulers();
            NextTaskScheduler();

            using (var collisionConfigurationInfo = new DefaultCollisionConstructionInfo
            {
                DefaultMaxPersistentManifoldPoolSize = 80000,
                DefaultMaxCollisionAlgorithmPoolSize = 80000
            })
            {
                CollisionConfiguration = new DefaultCollisionConfiguration(collisionConfigurationInfo);
            };
            Dispatcher                  = new CollisionDispatcherMultiThreaded(CollisionConfiguration);
            Broadphase                  = new DbvtBroadphase();
            _solverPool                 = new ConstraintSolverPoolMultiThreaded(MaxThreadCount);
            _parallelSolver             = new SequentialImpulseConstraintSolverMultiThreaded();
            World                       = new DiscreteDynamicsWorldMultiThreaded(Dispatcher, Broadphase, _solverPool, _parallelSolver, CollisionConfiguration);
            World.SolverInfo.SolverMode = SolverModes.Simd | SolverModes.UseWarmStarting;

            CreateGround();
            CreateBoxes();
        }