/**
* 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();
}
}
}