暫無描述
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

BottleneckUI.cs 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using UnityEngine;
  2. using UnityEngine.AdaptivePerformance;
  3. using UnityEngine.UI;
  4. public class BottleneckUI : MonoBehaviour
  5. {
  6. private IAdaptivePerformance ap;
  7. public PerformanceBottleneck targetBottleneck = PerformanceBottleneck.TargetFrameRate;
  8. public Text avgCPUTime, avgGPUTime, avgFrameTime;
  9. float avgCPUfloat, avgGPUfloat, avgFramefloat;
  10. public GameObject GPUBound, CPUBound, TargetFrameRateBound, UnknownBound;
  11. public GameObject GPUBoundT, CPUBoundT, TargetFrameRateBoundT, UnknownBoundT;
  12. void Start()
  13. {
  14. ap = Holder.Instance;
  15. if (ap == null)
  16. return;
  17. ap.PerformanceStatus.PerformanceBottleneckChangeEvent += OnBottleneckChange;
  18. }
  19. private void OnDestroy()
  20. {
  21. if (ap == null)
  22. return;
  23. ap.PerformanceStatus.PerformanceBottleneckChangeEvent -= OnBottleneckChange;
  24. }
  25. void Update()
  26. {
  27. if (ap == null)
  28. return;
  29. avgCPUfloat = ap.PerformanceStatus.FrameTiming.AverageCpuFrameTime;
  30. avgGPUfloat = ap.PerformanceStatus.FrameTiming.AverageGpuFrameTime;
  31. avgFramefloat = ap.PerformanceStatus.FrameTiming.AverageFrameTime;
  32. avgCPUTime.text = $"{(avgCPUfloat * 1000):F2} ms";
  33. avgGPUTime.text = $"{(avgGPUfloat * 1000):F2} ms";
  34. avgFrameTime.text = $"{(avgFramefloat * 1000):F2} ms";
  35. CheckTargetBottleneck();
  36. }
  37. void CheckTargetBottleneck()
  38. {
  39. switch (targetBottleneck)
  40. {
  41. case PerformanceBottleneck.CPU:
  42. if (!CPUBoundT.activeSelf)
  43. ActivateTargetBottleneckObject(CPUBoundT);
  44. break;
  45. case PerformanceBottleneck.GPU:
  46. if (!GPUBoundT.activeSelf)
  47. ActivateTargetBottleneckObject(GPUBoundT);
  48. break;
  49. case PerformanceBottleneck.TargetFrameRate:
  50. if (!TargetFrameRateBoundT.activeSelf)
  51. ActivateTargetBottleneckObject(TargetFrameRateBoundT);
  52. break;
  53. case PerformanceBottleneck.Unknown:
  54. if (!UnknownBoundT.activeSelf)
  55. ActivateTargetBottleneckObject(UnknownBoundT);
  56. break;
  57. }
  58. }
  59. void ActivateTargetBottleneckObject(GameObject go)
  60. {
  61. CPUBoundT.SetActive(false);
  62. GPUBoundT.SetActive(false);
  63. TargetFrameRateBoundT.SetActive(false);
  64. UnknownBoundT.SetActive(false);
  65. go.SetActive(true);
  66. }
  67. void OnBottleneckChange(PerformanceBottleneckChangeEventArgs ev)
  68. {
  69. DisableAllBottlenecks();
  70. switch (ev.PerformanceBottleneck)
  71. {
  72. case PerformanceBottleneck.CPU:
  73. Activate(CPUBound);
  74. break;
  75. case PerformanceBottleneck.GPU:
  76. Activate(GPUBound);
  77. break;
  78. case PerformanceBottleneck.TargetFrameRate:
  79. Activate(TargetFrameRateBound);
  80. break;
  81. case PerformanceBottleneck.Unknown:
  82. Activate(UnknownBound);
  83. break;
  84. }
  85. }
  86. void DisableAllBottlenecks()
  87. {
  88. CPUBound.SetActive(false);
  89. GPUBound.SetActive(false);
  90. TargetFrameRateBound.SetActive(false);
  91. UnknownBound.SetActive(false);
  92. }
  93. void Activate(GameObject go)
  94. {
  95. go.SetActive(true);
  96. }
  97. }