FrameRateMeasurer.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. /**
  2. * Copyright(c) Live2D Inc. All rights reserved.
  3. *
  4. * Use of this source code is governed by the Live2D Open Software license
  5. * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.
  6. */
  7. using System;
  8. using UnityEngine;
  9. using UnityEngine.UI;
  10. namespace Live2D.Cubism.Samples.AsyncBenchmark
  11. {
  12. /// <summary>
  13. /// Measure the frame rate.
  14. /// </summary>
  15. public class FrameRateMeasurer : MonoBehaviour
  16. {
  17. /// <summary>
  18. /// Target frame rate value.
  19. /// </summary>
  20. [SerializeField]
  21. public int TargetFrameRate = 60;
  22. /// <summary>
  23. /// Whether the model is spawnable or not.
  24. /// </summary>
  25. private bool LessThanTargetFrameRate { get; set; }
  26. /// <summary>
  27. /// The highest frame rate on running the application.
  28. /// </summary>
  29. private float HighestFrameRate { get; set; }
  30. /// <summary>
  31. /// Save the maximum frame rate.
  32. /// </summary>
  33. private int CurrentHighestFrameRate { get; set; }
  34. /// <summary>
  35. /// Save Previous Frame <see cref="CurrentHighestFrameRate"/>.
  36. /// </summary>
  37. private int PreviousHighestFrameRate { get; set; }
  38. /// <summary>
  39. /// The lowest frame rate on running the application.
  40. /// </summary>
  41. private float LowestFrameRate { get; set; }
  42. /// <summary>
  43. /// Save the minimum frame rate.
  44. /// </summary>
  45. private int CurrentLowestFrameRate { get; set; }
  46. /// <summary>
  47. /// Save Previous Frame <see cref="CurrentLowestFrameRate"/>.
  48. /// </summary>
  49. private int PreviousLowestFrameRate { get; set; }
  50. /// <summary>
  51. /// Get Model Instances Count.
  52. /// </summary>
  53. private int InstancesCount { get; set; }
  54. /// <summary>
  55. /// <see cref="AsyncBenchmark.FpsCounter"/> Component.
  56. /// </summary>
  57. private FpsCounter FpsCounter { get; set; }
  58. /// <summary>
  59. /// <see cref="AsyncBenchmark.BenchmarkController"/> Component.
  60. /// </summary>
  61. private BenchmarkController BenchmarkController { get; set; }
  62. /// <summary>
  63. /// <see cref="AsyncBenchmark.ModelSpawner"/> Conponent.
  64. /// </summary>
  65. private ModelSpawner ModelSpawner { get; set; }
  66. /// <summary>
  67. /// <see cref="AsyncBenchmark.TotalElapsedTime"/> Component.
  68. /// </summary>
  69. private TotalElapsedTime TotalElapsedTime { get; set; }
  70. /// <summary>
  71. /// <see cref="AsyncBenchmark.FrameRateUiHolder"/> Component.
  72. /// </summary>
  73. private FrameRateUiHolder FrameRateUiHolder { get; set; }
  74. /// <summary>
  75. /// Displays the frame rate and observation time when the maximum frame rate is observed.
  76. /// </summary>
  77. private Text HighestFrameRateUi { get; set; }
  78. /// <summary>
  79. /// Displays the frame rate and observation time when the minimum frame rate is observed.
  80. /// </summary>
  81. private Text LowestFrameRateUi { get; set; }
  82. /// <summary>
  83. /// Called by Unity. Getting target component and Initializing.
  84. /// </summary>
  85. private void Start()
  86. {
  87. // Getting components and initializing.
  88. FpsCounter = GetComponent<FpsCounter>();
  89. BenchmarkController = GetComponent<BenchmarkController>();
  90. ModelSpawner = GetComponent<ModelSpawner>();
  91. TotalElapsedTime = GetComponent<TotalElapsedTime>();
  92. FrameRateUiHolder = GetComponent<FrameRateUiHolder>();
  93. HighestFrameRateUi = FrameRateUiHolder.HighestFrameRateUi;
  94. LowestFrameRateUi = FrameRateUiHolder.LowestFrameRateUi;
  95. /// If <see cref="BenchmarkController"/> is present, get <see cref="BenchmarkController.TargetFrameRate"/>.
  96. TargetFrameRate = BenchmarkController != null
  97. ? BenchmarkController.TargetFrameRate
  98. : TargetFrameRate;
  99. }
  100. // Update is called once per frame
  101. private void Update()
  102. {
  103. /// Get value from <see cref="FpsCounter"/> Component.
  104. var fps = Mathf.FloorToInt(FpsCounter.Fps);
  105. // Compare the measured value with the maximum value so far.
  106. CurrentHighestFrameRate = fps > CurrentHighestFrameRate
  107. ? fps
  108. : CurrentHighestFrameRate;
  109. // Compare the measured value with the maximum value so far.
  110. CurrentLowestFrameRate = fps < CurrentLowestFrameRate
  111. ? fps
  112. : CurrentLowestFrameRate;
  113. // Whether the recorded frame rate has reached the target frame rate.
  114. LessThanTargetFrameRate = TargetFrameRate > CurrentHighestFrameRate;
  115. // When the observed value is lower than the set value.
  116. if (LessThanTargetFrameRate)
  117. {
  118. // Assign the maximum and minimum values.
  119. HighestFrameRate = HighestFrameRate < CurrentHighestFrameRate
  120. ? CurrentHighestFrameRate
  121. : HighestFrameRate;
  122. // Assign the maximum and minimum values.
  123. LowestFrameRate = LowestFrameRate > CurrentLowestFrameRate
  124. ? CurrentLowestFrameRate
  125. : LowestFrameRate;
  126. // Has the values been changed?
  127. var isMaximumFrameRateChange = (HighestFrameRate == CurrentHighestFrameRate) && (PreviousHighestFrameRate != CurrentHighestFrameRate);
  128. var isMinimumFrameRateChange = (LowestFrameRate == CurrentLowestFrameRate) && (PreviousLowestFrameRate != CurrentLowestFrameRate);
  129. var timeConversion = TimeConversion(TotalElapsedTime.ElapsedTime);
  130. // Update ui.
  131. if (isMaximumFrameRateChange)
  132. {
  133. var maximumObservationFrameRateText = string.Format("max ({0} fps)\n", HighestFrameRate);
  134. HighestFrameRateUi.text = string.Concat(maximumObservationFrameRateText, timeConversion);
  135. PreviousHighestFrameRate = CurrentHighestFrameRate;
  136. }
  137. if (isMinimumFrameRateChange)
  138. {
  139. var minimumObservationFrameRateText = string.Format("min ({0} fps)\n", LowestFrameRate);
  140. LowestFrameRateUi.text = string.Concat(minimumObservationFrameRateText, timeConversion);
  141. PreviousLowestFrameRate = CurrentLowestFrameRate;
  142. }
  143. }
  144. // When the observed value is higher than the set value.
  145. else
  146. {
  147. // Reset variables.
  148. CurrentHighestFrameRate = 0;
  149. PreviousHighestFrameRate = CurrentHighestFrameRate;
  150. CurrentLowestFrameRate = TargetFrameRate;
  151. PreviousLowestFrameRate = CurrentLowestFrameRate;
  152. }
  153. var storeInstancesCount = InstancesCount;
  154. /// Get Instances Count from <see cref="ModelSpawner"/> Component
  155. InstancesCount = ModelSpawner.InstancesCount;
  156. if (storeInstancesCount != InstancesCount || InstancesCount == 0)
  157. {
  158. var timeConversion = TimeConversion(0);
  159. // Reset ui.
  160. var highestFrameRateText = string.Format("max (0 fps)\n");
  161. HighestFrameRateUi.text = string.Concat(highestFrameRateText, timeConversion);
  162. var lowesttFrameRateText = string.Format("min (0 fps)\n");
  163. LowestFrameRateUi.text = string.Concat(lowesttFrameRateText, timeConversion);
  164. // Reset variables.
  165. CurrentHighestFrameRate = 0;
  166. PreviousHighestFrameRate = CurrentHighestFrameRate;
  167. HighestFrameRate = 0;
  168. CurrentLowestFrameRate = TargetFrameRate;
  169. PreviousLowestFrameRate = CurrentLowestFrameRate;
  170. LowestFrameRate = TargetFrameRate;
  171. }
  172. }
  173. /// <summary>
  174. /// Convert seconds to "hours:minutes:seconds".
  175. /// </summary>
  176. /// <param name="second">Number of seconds it conversion source.</param>
  177. /// <returns>String type converted to "hours:minutes:seconds" notation.</returns>
  178. private string TimeConversion(int second)
  179. {
  180. // Generate TimeSpan structure type.
  181. var timeSpan = new TimeSpan(0, 0, second);
  182. return timeSpan.ToString();
  183. }
  184. }
  185. }