private void InitSystems()
        {
            _systems = new BaseSystem[]
            {
                // Input System must go first to have accurate snapshots
                new InputSystem(Engine),
                // TransformResetSystem must go before any system that changes the transform of entities
                new TransformResetSystem(Engine),

                // Section below is not dependent on other systems
                new GravityHolePassiveAnimationSystem(Engine, ProcessManager, Content),
                new AnimationSystem(Engine),
                new ParallaxBackgroundSystem(Engine, Camera),
                new PulseSystem(Engine),
                new PassiveRotationSystem(Engine),
                new MenuBackgroundDestructionSystem(Engine, Camera),
                new ProjectileColorSyncSystem(Engine),

                // Section below is ordered based on dependency from Top (least dependent) to Bottom (most dependent)
                new ChasingSpeedIncreaseSystem(Engine),
                new LaserEnemySystem(Engine),
                new GravitySystem(Engine),
                new EnemySeparationSystem(Engine), // Depends on the Quad Tree, however this system needs to go before movement system. It will use the previous frame's quad tree.
                new MovementSystem(Engine),
                new PlayerShieldSystem(Engine),
                new QuadTreeSystem(Engine),
                new SuperShieldSystem(Engine),

                // Until Changed, EnemyRotationSystem must go after MovementSystem or enemy ships will not bounce off of walls
                new EnemyRotationSystem(Engine),

                // Collision Detection must go last to have accurate collision detection
                new CollisionDetectionSystem(Engine)
            };

            RenderSystem = new RenderSystem(GameManager.GraphicsDevice, Content, Engine);
#if DEBUG
            CollisionDebugRenderSystem = new CollisionDebugRenderSystem(GameManager.GraphicsDevice, Engine);
#endif
#if DEBUG
            RenderCullingDebugRenderSystem = new RenderCullingDebugRenderSystem(GameManager.GraphicsDevice, Engine);
#endif
#if DEBUG
            QuadTreeDebugRenderSystem = new QuadTreeDebugRenderSystem(GameManager.GraphicsDevice, Engine);
#endif
        }
        protected override void OnRender(float dt, float betweenFrameAlpha)
        {
            int enableFrameSmoothing = CVars.Get <bool>("graphics_frame_smoothing") ? 1 : 0;

            betweenFrameAlpha = betweenFrameAlpha * enableFrameSmoothing + (1 - enableFrameSmoothing);

            _fxaaPPE.Enabled = CVars.Get <bool>("graphics_fxaa");
            _smaaPPE.Enabled = CVars.Get <bool>("graphics_smaa");

            GameManager.GraphicsDevice.Clear(Color.Black);

            Camera camera = Camera;

#if DEBUG
            if (CVars.Get <bool>("debug_force_debug_camera"))
            {
                camera = DebugCamera;
            }
#endif

            PostProcessor.Begin();
            {
                RenderSystem.DrawEntities(Camera,
                                          Constants.Render.RENDER_GROUP_GAME_ENTITIES,
                                          dt,
                                          betweenFrameAlpha,
                                          camera);
                RenderSystem.SpriteBatch.Begin(SpriteSortMode.Deferred,
                                               null,
                                               null,
                                               null,
                                               null,
                                               null,
                                               camera.GetInterpolatedTransformMatrix(betweenFrameAlpha));
                if (!CVars.Get <bool>("particle_gpu_accelerated"))
                {
                    VelocityParticleManager.Draw(RenderSystem.SpriteBatch);
                }
                RenderSystem.SpriteBatch.End();
                if (CVars.Get <bool>("particle_gpu_accelerated"))
                {
                    GPUParticleManager.UpdateAndDraw(Camera, dt, betweenFrameAlpha, camera);
                }
            }
            // We have to defer drawing the post-processor results
            // because of unexpected behavior within MonoGame.
            RenderTarget2D postProcessingResult = PostProcessor.End(false);

            // Stars
            RenderSystem.DrawEntities(Camera,
                                      Constants.Render.RENDER_GROUP_STARS,
                                      dt,
                                      betweenFrameAlpha, camera);   // Stars
            RenderSystem.SpriteBatch.Begin();
            RenderSystem.SpriteBatch.Draw(postProcessingResult,
                                          postProcessingResult.Bounds,
                                          Color.White); // Post-processing results
            RenderSystem.SpriteBatch.End();
            // Shield Resource
            RenderSystem.DrawEntities(Camera,
                                      Constants.Render.RENDER_GROUP_NO_GLOW,
                                      dt,
                                      betweenFrameAlpha, camera);

#if DEBUG
            if (CVars.Get <bool>("debug_show_collision_shapes"))
            {
                CollisionDebugRenderSystem.Draw(camera.GetInterpolatedTransformMatrix(betweenFrameAlpha), dt);
            }
#endif
#if DEBUG
            if (CVars.Get <bool>("debug_show_render_culling"))
            {
                Camera debugCamera = CVars.Get <bool>("debug_force_debug_camera") ? DebugCamera : null;
                RenderCullingDebugRenderSystem.Draw(Camera, dt, debugCamera);
            }
#endif
#if DEBUG
            if (CVars.Get <bool>("debug_show_quad_trees"))
            {
                Camera debugCamera = CVars.Get <bool>("debug_force_debug_camera") ? DebugCamera : null;
                QuadTreeDebugRenderSystem.Draw(Camera, dt, debugCamera);
            }
#endif

            base.OnRender(dt, betweenFrameAlpha);
        }