/** * Copyright(c) Live2D Inc. All rights reserved. * * Use of this source code is governed by the Live2D Open Software license * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. */ using System; using UnityEngine; using UnityEngine.UI; namespace Live2D.Cubism.Samples.AsyncBenchmark { /// /// Measure the frame rate. /// public class FrameRateMeasurer : MonoBehaviour { /// /// Target frame rate value. /// [SerializeField] public int TargetFrameRate = 60; /// /// Whether the model is spawnable or not. /// private bool LessThanTargetFrameRate { get; set; } /// /// The highest frame rate on running the application. /// private float HighestFrameRate { get; set; } /// /// Save the maximum frame rate. /// private int CurrentHighestFrameRate { get; set; } /// /// Save Previous Frame . /// private int PreviousHighestFrameRate { get; set; } /// /// The lowest frame rate on running the application. /// private float LowestFrameRate { get; set; } /// /// Save the minimum frame rate. /// private int CurrentLowestFrameRate { get; set; } /// /// Save Previous Frame . /// private int PreviousLowestFrameRate { get; set; } /// /// Get Model Instances Count. /// private int InstancesCount { get; set; } /// /// Component. /// private FpsCounter FpsCounter { get; set; } /// /// Component. /// private BenchmarkController BenchmarkController { get; set; } /// /// Conponent. /// private ModelSpawner ModelSpawner { get; set; } /// /// Component. /// private TotalElapsedTime TotalElapsedTime { get; set; } /// /// Component. /// private FrameRateUiHolder FrameRateUiHolder { get; set; } /// /// Displays the frame rate and observation time when the maximum frame rate is observed. /// private Text HighestFrameRateUi { get; set; } /// /// Displays the frame rate and observation time when the minimum frame rate is observed. /// private Text LowestFrameRateUi { get; set; } /// /// Called by Unity. Getting target component and Initializing. /// private void Start() { // Getting components and initializing. FpsCounter = GetComponent(); BenchmarkController = GetComponent(); ModelSpawner = GetComponent(); TotalElapsedTime = GetComponent(); FrameRateUiHolder = GetComponent(); HighestFrameRateUi = FrameRateUiHolder.HighestFrameRateUi; LowestFrameRateUi = FrameRateUiHolder.LowestFrameRateUi; /// If is present, get . TargetFrameRate = BenchmarkController != null ? BenchmarkController.TargetFrameRate : TargetFrameRate; } // Update is called once per frame private void Update() { /// Get value from Component. var fps = Mathf.FloorToInt(FpsCounter.Fps); // Compare the measured value with the maximum value so far. CurrentHighestFrameRate = fps > CurrentHighestFrameRate ? fps : CurrentHighestFrameRate; // Compare the measured value with the maximum value so far. CurrentLowestFrameRate = fps < CurrentLowestFrameRate ? fps : CurrentLowestFrameRate; // Whether the recorded frame rate has reached the target frame rate. LessThanTargetFrameRate = TargetFrameRate > CurrentHighestFrameRate; // When the observed value is lower than the set value. if (LessThanTargetFrameRate) { // Assign the maximum and minimum values. HighestFrameRate = HighestFrameRate < CurrentHighestFrameRate ? CurrentHighestFrameRate : HighestFrameRate; // Assign the maximum and minimum values. LowestFrameRate = LowestFrameRate > CurrentLowestFrameRate ? CurrentLowestFrameRate : LowestFrameRate; // Has the values been changed? var isMaximumFrameRateChange = (HighestFrameRate == CurrentHighestFrameRate) && (PreviousHighestFrameRate != CurrentHighestFrameRate); var isMinimumFrameRateChange = (LowestFrameRate == CurrentLowestFrameRate) && (PreviousLowestFrameRate != CurrentLowestFrameRate); var timeConversion = TimeConversion(TotalElapsedTime.ElapsedTime); // Update ui. if (isMaximumFrameRateChange) { var maximumObservationFrameRateText = string.Format("max ({0} fps)\n", HighestFrameRate); HighestFrameRateUi.text = string.Concat(maximumObservationFrameRateText, timeConversion); PreviousHighestFrameRate = CurrentHighestFrameRate; } if (isMinimumFrameRateChange) { var minimumObservationFrameRateText = string.Format("min ({0} fps)\n", LowestFrameRate); LowestFrameRateUi.text = string.Concat(minimumObservationFrameRateText, timeConversion); PreviousLowestFrameRate = CurrentLowestFrameRate; } } // When the observed value is higher than the set value. else { // Reset variables. CurrentHighestFrameRate = 0; PreviousHighestFrameRate = CurrentHighestFrameRate; CurrentLowestFrameRate = TargetFrameRate; PreviousLowestFrameRate = CurrentLowestFrameRate; } var storeInstancesCount = InstancesCount; /// Get Instances Count from Component InstancesCount = ModelSpawner.InstancesCount; if (storeInstancesCount != InstancesCount || InstancesCount == 0) { var timeConversion = TimeConversion(0); // Reset ui. var highestFrameRateText = string.Format("max (0 fps)\n"); HighestFrameRateUi.text = string.Concat(highestFrameRateText, timeConversion); var lowesttFrameRateText = string.Format("min (0 fps)\n"); LowestFrameRateUi.text = string.Concat(lowesttFrameRateText, timeConversion); // Reset variables. CurrentHighestFrameRate = 0; PreviousHighestFrameRate = CurrentHighestFrameRate; HighestFrameRate = 0; CurrentLowestFrameRate = TargetFrameRate; PreviousLowestFrameRate = CurrentLowestFrameRate; LowestFrameRate = TargetFrameRate; } } /// /// Convert seconds to "hours:minutes:seconds". /// /// Number of seconds it conversion source. /// String type converted to "hours:minutes:seconds" notation. private string TimeConversion(int second) { // Generate TimeSpan structure type. var timeSpan = new TimeSpan(0, 0, second); return timeSpan.ToString(); } } }