public SamsungGameSDKAdaptivePerformanceSubsystem()
        {
            m_Api       = new NativeApi(OnSustainedPerformanceWarning, OnSustainedPerformanceTimeout);
            m_Scheduler = new JNITaskScheduler();
            m_SkinTemp  = new AsyncValue <int>(m_Scheduler, -1, 2.7f, () => m_Api.GetSkinTempLevel());
            m_PSTLevel  = new AsyncValue <int>(m_Scheduler, -1, 3.3f, () => m_Api.GetPSTLevel());
            m_GPUTime   = new AsyncValue <double>(m_Scheduler, -1.0, 0.0f, () => m_Api.GetGpuFrameTime());

            maxGpuPerformanceLevel = 3;
            maxCpuPerformanceLevel = 3;

            m_MainTemperature = m_SkinTemp;
        }
        override public void Start()
        {
            if (m_Api.Initialize())
            {
                if (Version.TryParse(m_Api.GetVersion(), out m_Version))
                {
                    if (m_Version >= new Version(1, 6))
                    {
                        m_MaxTempLevel    = 7;
                        m_MinTempLevel    = 0;
                        initialized       = true;
                        m_MainTemperature = m_SkinTemp;
                    }
                    else if (m_Version >= new Version(1, 5))
                    {
                        m_MaxTempLevel    = 6;
                        m_MinTempLevel    = 0;
                        initialized       = true;
                        m_MainTemperature = m_PSTLevel;
                        m_SkinTemp        = null;
                    }
                    else
                    {
                        m_Api.Terminate();
                        initialized = false;
                    }
                }
            }

            if (initialized)
            {
                ImmediateUpdateTemperature();

                var args = new TemperatureChangeEventArgs();
                args.temperatureLevel = GetTemperatureLevel();
                args.temperatureTrend = 0.0f;
                TemperatureChange?.Invoke(this, args);
            }
        }