< Summary

Class:AutoQualitySettingsComponent
Assembly:SettingsControllers
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/Settings/SettingsControllers/AutoQualitySettingsComponent.cs
Covered lines:24
Uncovered lines:17
Coverable lines:41
Total lines:101
Line coverage:58.5% (24 of 41)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Start()0%440100%
OnDestroy()0%220100%
OnQualitySettingsChanged(...)0%3.033085.71%
SetAutoSettings(...)0%4.123050%
AutoSettingsLoop()0%30500%
UpdateQuality(...)0%20400%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/Settings/SettingsControllers/AutoQualitySettingsComponent.cs

#LineLine coverage
 1using System.Collections;
 2using DCL;
 3using DCL.Helpers;
 4using DCL.SettingsData;
 5using UnityEngine;
 6using QualitySettings = DCL.SettingsData.QualitySettings;
 7
 8/// <summary>
 9/// Controller to change the quality settings automatically based on performance
 10/// </summary>
 11public class AutoQualitySettingsComponent : MonoBehaviour
 12{
 13    private const float LOOP_TIME_SECONDS = 1f;
 14    private const string LAST_QUALITY_INDEX = "LAST_QUALITY_INDEX";
 15    private const int TARGET_FPS = 30;
 16
 17    [SerializeField] internal BooleanVariable autoQualityEnabled;
 18    [SerializeField] internal PerformanceMetricsDataVariable performanceMetricsData;
 019    internal QualitySettingsData qualitySettings => Settings.i.autoqualitySettings;
 20
 21    internal int currentQualityIndex;
 22    private Coroutine settingsCheckerCoroutine;
 23    internal IAutoQualityController controller;
 24    internal bool fpsCapped;
 25
 26    void Start()
 27    {
 12728        if (autoQualityEnabled == null || qualitySettings == null || qualitySettings.Length == 0)
 229            return;
 30
 12531        currentQualityIndex = PlayerPrefsUtils.GetInt(LAST_QUALITY_INDEX, (qualitySettings.Length - 1) / 2);
 32
 12533        controller = new AutoQualityUncappedFPSController(currentQualityIndex, qualitySettings);
 34
 12535        Settings.i.OnQualitySettingsChanged += OnQualitySettingsChanged;
 12536        autoQualityEnabled.OnChange += SetAutoSettings;
 37
 12538        fpsCapped = !Settings.i.currentQualitySettings.fpsCap;
 12539        OnQualitySettingsChanged(Settings.i.qualitySettings);
 12540        SetAutoSettings(autoQualityEnabled.Get(), !autoQualityEnabled.Get());
 12541    }
 42
 43    private void OnDestroy()
 44    {
 12645        if (autoQualityEnabled != null)
 12446            autoQualityEnabled.OnChange -= SetAutoSettings;
 12647        Settings.i.OnQualitySettingsChanged -= OnQualitySettingsChanged;
 12648    }
 49
 50    internal void OnQualitySettingsChanged(QualitySettings settings)
 51    {
 12852        if (fpsCapped == settings.fpsCap)
 053            return;
 54
 12855        fpsCapped = settings.fpsCap;
 12856        if (settings.fpsCap)
 3557            controller = new AutoQualityCappedFPSController(TARGET_FPS, currentQualityIndex, qualitySettings);
 58        else
 9359            controller = new AutoQualityUncappedFPSController(currentQualityIndex, qualitySettings);
 9360    }
 61
 62    private void SetAutoSettings(bool newValue, bool oldValue)
 63    {
 12564        if (settingsCheckerCoroutine != null)
 65        {
 066            StopCoroutine(settingsCheckerCoroutine);
 067            settingsCheckerCoroutine = null;
 68        }
 69
 12570        if (newValue)
 71        {
 072            settingsCheckerCoroutine = StartCoroutine(AutoSettingsLoop());
 073        }
 74        else
 75        {
 12576            controller.ResetEvaluation();
 77        }
 12578    }
 79
 80    private IEnumerator AutoSettingsLoop()
 81    {
 082        while (true)
 83        {
 084            UpdateQuality(controller.EvaluateQuality(performanceMetricsData?.Get()));
 085            yield return new WaitForSeconds(LOOP_TIME_SECONDS);
 86        }
 87    }
 88
 89    private void UpdateQuality(int newQualityIndex)
 90    {
 091        if (newQualityIndex == currentQualityIndex)
 092            return;
 93
 094        if (newQualityIndex <= 0 || newQualityIndex >= qualitySettings.Length)
 095            return;
 96
 097        PlayerPrefsUtils.SetInt(LAST_QUALITY_INDEX, currentQualityIndex);
 098        currentQualityIndex = newQualityIndex;
 099        Settings.i.ApplyAutoQualitySettings(currentQualityIndex);
 0100    }
 101}