public int EvaluateQuality(PerformanceMetricsData metrics) { if (metrics == null) { return(currentQualityIndex); } fpsEvaluations.Add(metrics.fpsCount); if (fpsEvaluations.Count <= EVALUATIONS_SIZE) { return(currentQualityIndex); } fpsEvaluations.RemoveAt(0); float performance = fpsEvaluations.Average() / targetFPS; int newCurrentQualityIndex = currentQualityIndex; if (performance < STAY_MARGIN) { newCurrentQualityIndex = Mathf.Max(0, currentQualityIndex - 1); } if (performance >= INCREASE_MARGIN) { newCurrentQualityIndex = Mathf.Min(qualitySettings.Length - 1, currentQualityIndex + 2); //We increase quality more aggressively than we reduce } if (newCurrentQualityIndex != currentQualityIndex) { ResetEvaluation(); } currentQualityIndex = newCurrentQualityIndex; return(currentQualityIndex); }
public int EvaluateQuality(PerformanceMetricsData metrics) { if (metrics == null) { return(currentQualityIndex); } //TODO refine this evaluation fpsEvaluations.Add(metrics.fpsCount); if (fpsEvaluations.Count <= EVALUATIONS_SIZE) { return(currentQualityIndex); } fpsEvaluations.RemoveAt(0); float average = fpsEvaluations.Average(); int newCurrentQualityIndex = currentQualityIndex; if (average <= FPSEvaluation.WORSE) { newCurrentQualityIndex = Mathf.Max(0, currentQualityIndex - 1); } if (average >= FPSEvaluation.GREAT) { newCurrentQualityIndex = Mathf.Min(qualitySettings.Length - 1, currentQualityIndex + 1); } if (newCurrentQualityIndex != currentQualityIndex) { ResetEvaluation(); } currentQualityIndex = newCurrentQualityIndex; return(currentQualityIndex); }