| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- /**
- * 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
- {
- /// <summary>
- /// Measure the frame rate.
- /// </summary>
- public class FrameRateMeasurer : MonoBehaviour
- {
- /// <summary>
- /// Target frame rate value.
- /// </summary>
- [SerializeField]
- public int TargetFrameRate = 60;
- /// <summary>
- /// Whether the model is spawnable or not.
- /// </summary>
- private bool LessThanTargetFrameRate { get; set; }
- /// <summary>
- /// The highest frame rate on running the application.
- /// </summary>
- private float HighestFrameRate { get; set; }
- /// <summary>
- /// Save the maximum frame rate.
- /// </summary>
- private int CurrentHighestFrameRate { get; set; }
- /// <summary>
- /// Save Previous Frame <see cref="CurrentHighestFrameRate"/>.
- /// </summary>
- private int PreviousHighestFrameRate { get; set; }
- /// <summary>
- /// The lowest frame rate on running the application.
- /// </summary>
- private float LowestFrameRate { get; set; }
- /// <summary>
- /// Save the minimum frame rate.
- /// </summary>
- private int CurrentLowestFrameRate { get; set; }
- /// <summary>
- /// Save Previous Frame <see cref="CurrentLowestFrameRate"/>.
- /// </summary>
- private int PreviousLowestFrameRate { get; set; }
- /// <summary>
- /// Get Model Instances Count.
- /// </summary>
- private int InstancesCount { get; set; }
- /// <summary>
- /// <see cref="AsyncBenchmark.FpsCounter"/> Component.
- /// </summary>
- private FpsCounter FpsCounter { get; set; }
- /// <summary>
- /// <see cref="AsyncBenchmark.BenchmarkController"/> Component.
- /// </summary>
- private BenchmarkController BenchmarkController { get; set; }
- /// <summary>
- /// <see cref="AsyncBenchmark.ModelSpawner"/> Conponent.
- /// </summary>
- private ModelSpawner ModelSpawner { get; set; }
- /// <summary>
- /// <see cref="AsyncBenchmark.TotalElapsedTime"/> Component.
- /// </summary>
- private TotalElapsedTime TotalElapsedTime { get; set; }
- /// <summary>
- /// <see cref="AsyncBenchmark.FrameRateUiHolder"/> Component.
- /// </summary>
- private FrameRateUiHolder FrameRateUiHolder { get; set; }
- /// <summary>
- /// Displays the frame rate and observation time when the maximum frame rate is observed.
- /// </summary>
- private Text HighestFrameRateUi { get; set; }
- /// <summary>
- /// Displays the frame rate and observation time when the minimum frame rate is observed.
- /// </summary>
- private Text LowestFrameRateUi { get; set; }
- /// <summary>
- /// Called by Unity. Getting target component and Initializing.
- /// </summary>
- private void Start()
- {
- // Getting components and initializing.
- FpsCounter = GetComponent<FpsCounter>();
- BenchmarkController = GetComponent<BenchmarkController>();
- ModelSpawner = GetComponent<ModelSpawner>();
- TotalElapsedTime = GetComponent<TotalElapsedTime>();
- FrameRateUiHolder = GetComponent<FrameRateUiHolder>();
- HighestFrameRateUi = FrameRateUiHolder.HighestFrameRateUi;
- LowestFrameRateUi = FrameRateUiHolder.LowestFrameRateUi;
- /// If <see cref="BenchmarkController"/> is present, get <see cref="BenchmarkController.TargetFrameRate"/>.
- TargetFrameRate = BenchmarkController != null
- ? BenchmarkController.TargetFrameRate
- : TargetFrameRate;
- }
- // Update is called once per frame
- private void Update()
- {
- /// Get value from <see cref="FpsCounter"/> 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 <see cref="ModelSpawner"/> 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;
- }
- }
- /// <summary>
- /// Convert seconds to "hours:minutes:seconds".
- /// </summary>
- /// <param name="second">Number of seconds it conversion source.</param>
- /// <returns>String type converted to "hours:minutes:seconds" notation.</returns>
- private string TimeConversion(int second)
- {
- // Generate TimeSpan structure type.
- var timeSpan = new TimeSpan(0, 0, second);
- return timeSpan.ToString();
- }
- }
- }
|