public void Start()
        {
            APLog.enabled            = StartupSettings.Logging;
            LoggingFrequencyInFrames = StartupSettings.StatsLoggingFrequencyInFrames;
            if (!StartupSettings.Enable)
            {
                return;
            }

            if (InitializeSubsystem(StartupSettings.PreferredSubsystem))
            {
                m_Subsystem = StartupSettings.PreferredSubsystem;
            }
            else
            {
                System.Collections.Generic.List <Provider.AdaptivePerformanceSubsystemDescriptor> perfDescriptors = Provider.AdaptivePerformanceSubsystemRegistry.GetRegisteredDescriptors();
                if (perfDescriptors.Count == 0)
                {
                    APLog.Debug("No Subsystems found and initialized.");
                }
                foreach (var perfDesc in perfDescriptors)
                {
                    var subsystem = perfDesc.Create();
                    if (InitializeSubsystem(subsystem))
                    {
                        m_Subsystem = subsystem;
                        break;
                    }
                }
            }

            if (m_Subsystem != null)
            {
                m_DevicePerfControl = new DevicePerformanceControlImpl(m_Subsystem.PerformanceLevelControl);
                m_AutoPerformanceLevelController = new AutoPerformanceLevelController(m_DevicePerfControl, PerformanceStatus, ThermalStatus);

                m_AppLifecycle = m_Subsystem.ApplicationLifecycle;

                if (!m_Subsystem.Capabilities.HasFlag(Provider.Feature.CpuFrameTime))
                {
                    m_CpuFrameTimeProvider = new CpuTimeProvider();
                    StartCoroutine(InvokeEndOfFrame());
                }

                m_TemperatureTrend = new TemperatureTrend(m_Subsystem.Capabilities.HasFlag(Provider.Feature.TemperatureTrend));

                if (m_RequestedCpuLevel == Constants.UnknownPerformanceLevel)
                {
                    m_RequestedCpuLevel = m_DevicePerfControl.MaxCpuPerformanceLevel;
                }

                if (m_RequestedGpuLevel == Constants.UnknownPerformanceLevel)
                {
                    m_RequestedGpuLevel = m_DevicePerfControl.MaxGpuPerformanceLevel;
                }

                if (m_Subsystem.PerformanceLevelControl == null)
                {
                    m_DevicePerfControl.PerformanceControlMode = PerformanceControlMode.System;
                }
                else if (AutomaticPerformanceControl)
                {
                    m_DevicePerfControl.PerformanceControlMode = PerformanceControlMode.Automatic;
                }
                else
                {
                    m_DevicePerfControl.PerformanceControlMode = PerformanceControlMode.Manual;
                }

                ThermalEvent += (ThermalMetrics thermalMetrics) => LogThermalEvent(thermalMetrics);
                PerformanceBottleneckChangeEvent += (PerformanceBottleneckChangeEventArgs ev) => LogBottleneckEvent(ev);
                PerformanceLevelChangeEvent      += (PerformanceLevelChangeEventArgs ev) => LogPerformanceLevelEvent(ev);

                UpdateSubsystem();
            }
        }
        public void Awake()
        {
            APLog.enabled = true;
            if (AdaptivePerformanceGeneralSettings.Instance == null)
            {
                APLog.Debug("No Provider was configured for use. Make sure you added at least one Provider in the Adaptive Performance Settings.");
                AdaptivePerformanceAnalytics.SendAdaptiveStartupEvent(m_Subsystem);
                return;
            }

            if (!AdaptivePerformanceGeneralSettings.Instance.InitManagerOnStart)
            {
                APLog.Debug("Adaptive Performance is disabled via Settings.");
                AdaptivePerformanceAnalytics.SendAdaptiveStartupEvent(m_Subsystem);
                return;
            }

            var activeLoader = AdaptivePerformanceGeneralSettings.Instance.Manager.ActiveLoaderAs <AdaptivePerformanceLoader>();

            if (activeLoader == null)
            {
                APLog.Debug("No Active Loader was found. Make sure to select your loader in the Adaptive Performance Settings for this platform.");
                AdaptivePerformanceAnalytics.SendAdaptiveStartupEvent(m_Subsystem);
                return;
            }

            m_Settings = activeLoader.GetSettings();
            if (m_Settings == null)
            {
                APLog.Debug("No Settings available. Did the Post Process Buildstep fail?");
                AdaptivePerformanceAnalytics.SendAdaptiveStartupEvent(m_Subsystem);
                return;
            }

            AutomaticPerformanceControl = m_Settings.automaticPerformanceMode;
            LoggingFrequencyInFrames    = m_Settings.statsLoggingFrequencyInFrames;
            APLog.enabled = m_Settings.logging;

            if (m_Subsystem == null)
            {
                var subsystem = (Provider.AdaptivePerformanceSubsystem)activeLoader.GetDefaultSubsystem();

                if (subsystem != null)
                {
                    if (subsystem.initialized)
                    {
                        m_Subsystem = subsystem;
                        APLog.Debug("Subsystem version={0}", m_Subsystem.Version);
                    }
                    else
                    {
                        subsystem.Destroy();
                        APLog.Debug("Subsystem not initialized.");
                        AdaptivePerformanceAnalytics.SendAdaptiveStartupEvent(m_Subsystem);
                        return;
                    }
                }
            }

            if (m_Subsystem != null)
            {
                m_UseProviderOverallFrameTime    = m_Subsystem.Capabilities.HasFlag(Provider.Feature.OverallFrameTime);
                m_DevicePerfControl              = new DevicePerformanceControlImpl(m_Subsystem.PerformanceLevelControl);
                m_AutoPerformanceLevelController = new AutoPerformanceLevelController(m_DevicePerfControl, PerformanceStatus, ThermalStatus);

                m_AppLifecycle = m_Subsystem.ApplicationLifecycle;

                if (!m_Subsystem.Capabilities.HasFlag(Provider.Feature.CpuFrameTime))
                {
                    m_CpuFrameTimeProvider = new CpuTimeProvider();
                    StartCoroutine(InvokeEndOfFrame());
                }

                if (!m_Subsystem.Capabilities.HasFlag(Provider.Feature.GpuFrameTime))
                {
                    m_GpuFrameTimeProvider = new GpuTimeProvider();
                }

                m_TemperatureTrend = new TemperatureTrend(m_Subsystem.Capabilities.HasFlag(Provider.Feature.TemperatureTrend));

                // Request maximum performance by default
                if (m_RequestedCpuLevel == Constants.UnknownPerformanceLevel)
                {
                    m_RequestedCpuLevel = m_DevicePerfControl.MaxCpuPerformanceLevel;
                }
                if (m_RequestedGpuLevel == Constants.UnknownPerformanceLevel)
                {
                    m_RequestedGpuLevel = m_DevicePerfControl.MaxGpuPerformanceLevel;
                }

                // Override to get maximum performance by default in 'auto' mode
                m_NewUserPerformanceLevelRequest = true;

                if (m_Subsystem.PerformanceLevelControl == null)
                {
                    m_DevicePerfControl.PerformanceControlMode = PerformanceControlMode.System;
                }
                else if (AutomaticPerformanceControl)
                {
                    m_DevicePerfControl.PerformanceControlMode = PerformanceControlMode.Automatic;
                }
                else
                {
                    m_DevicePerfControl.PerformanceControlMode = PerformanceControlMode.Manual;
                }

                ThermalEvent += (ThermalMetrics thermalMetrics) => LogThermalEvent(thermalMetrics);
                PerformanceBottleneckChangeEvent += (PerformanceBottleneckChangeEventArgs ev) => LogBottleneckEvent(ev);
                PerformanceLevelChangeEvent      += (PerformanceLevelChangeEventArgs ev) => LogPerformanceLevelEvent(ev);

                if (m_Subsystem.Capabilities.HasFlag(Provider.Feature.CpuPerformanceBoost))
                {
                    PerformanceBoostChangeEvent += (PerformanceBoostChangeEventArgs ev) => LogBoostEvent(ev);
                }

                Indexer = new AdaptivePerformanceIndexer(ref m_Settings);

                UpdateSubsystem();
            }
            AdaptivePerformanceAnalytics.SendAdaptiveStartupEvent(m_Subsystem);
        }