No Description
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.

AdaptivePerformanceTest.cs 23KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557
  1. using System;
  2. using NUnit.Framework;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using UnityEditor.AdaptivePerformance.Simulator.Editor;
  7. using UnityEngine;
  8. using UnityEngine.TestTools;
  9. using UnityEngine.AdaptivePerformance;
  10. namespace UnityEditor.AdaptivePerformance.Tests
  11. {
  12. public class AdaptivePerformanceSimulation : ManagementTestSetup
  13. {
  14. [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
  15. static void Setup()
  16. {
  17. if (!AdaptivePerformanceGeneralSettings.Instance || !AdaptivePerformanceGeneralSettings.Instance.Manager || !AdaptivePerformanceGeneralSettings.Instance.Manager.isInitializationComplete)
  18. return;
  19. IAdaptivePerformanceSettings settings = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetSettings();
  20. if (settings == null)
  21. return;
  22. settings.automaticPerformanceMode = false;
  23. settings.logging = false;
  24. }
  25. [OneTimeSetUp]
  26. public void SetupAdaptivePerformanceManagerTest()
  27. {
  28. var ap = Holder.Instance;
  29. ap.DevelopmentSettings.Logging = false;
  30. ap.DevicePerformanceControl.AutomaticPerformanceControl = false;
  31. }
  32. [OneTimeTearDown]
  33. public void TeardownAdaptivePerformanceManagerTest()
  34. {
  35. base.TearDownTest();
  36. }
  37. [UnityTest]
  38. public IEnumerator Applies_Cpu_Level()
  39. {
  40. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  41. var ap = Holder.Instance;
  42. subsystem.AcceptsPerformanceLevel = true;
  43. var level = ap.DevicePerformanceControl.MaxCpuPerformanceLevel;
  44. ap.DevicePerformanceControl.CpuLevel = level;
  45. yield return null;
  46. Assert.AreEqual(level, ap.DevicePerformanceControl.CpuLevel);
  47. Assert.AreEqual(level, ap.PerformanceStatus.PerformanceMetrics.CurrentCpuLevel);
  48. }
  49. [UnityTest]
  50. public IEnumerator Applies_Gpu_Level()
  51. {
  52. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  53. var ap = Holder.Instance;
  54. subsystem.AcceptsPerformanceLevel = true;
  55. var level = ap.DevicePerformanceControl.MaxGpuPerformanceLevel;
  56. ap.DevicePerformanceControl.GpuLevel = level;
  57. yield return null;
  58. Assert.AreEqual(level, ap.DevicePerformanceControl.GpuLevel);
  59. Assert.AreEqual(level, ap.PerformanceStatus.PerformanceMetrics.CurrentGpuLevel);
  60. }
  61. [UnityTest]
  62. public IEnumerator Unknown_GpuLevel_In_Throttling_State()
  63. {
  64. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  65. var ap = Holder.Instance;
  66. subsystem.AcceptsPerformanceLevel = false;
  67. ap.DevicePerformanceControl.GpuLevel = ap.DevicePerformanceControl.MaxCpuPerformanceLevel;
  68. yield return null;
  69. Assert.AreEqual(PerformanceControlMode.System, ap.DevicePerformanceControl.PerformanceControlMode);
  70. Assert.AreEqual(Constants.UnknownPerformanceLevel, ap.PerformanceStatus.PerformanceMetrics.CurrentGpuLevel);
  71. }
  72. [UnityTest]
  73. public IEnumerator Unknown_CpuLevel_In_Throttling_State()
  74. {
  75. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  76. var ap = Holder.Instance;
  77. subsystem.AcceptsPerformanceLevel = false;
  78. ap.DevicePerformanceControl.CpuLevel = ap.DevicePerformanceControl.MaxCpuPerformanceLevel;
  79. yield return null;
  80. Assert.AreEqual(PerformanceControlMode.System, ap.DevicePerformanceControl.PerformanceControlMode);
  81. Assert.AreEqual(Constants.UnknownPerformanceLevel, ap.PerformanceStatus.PerformanceMetrics.CurrentCpuLevel);
  82. }
  83. [UnityTest]
  84. public IEnumerator Ignores_Invalid_Cpu_Level()
  85. {
  86. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  87. var ap = Holder.Instance;
  88. subsystem.AcceptsPerformanceLevel = true;
  89. subsystem.WarningLevel = WarningLevel.NoWarning;
  90. ap.DevicePerformanceControl.CpuLevel = 100;
  91. yield return null;
  92. Assert.AreEqual(Constants.UnknownPerformanceLevel, ap.PerformanceStatus.PerformanceMetrics.CurrentCpuLevel);
  93. }
  94. [UnityTest]
  95. public IEnumerator Ignores_Invalid_Gpu_Level()
  96. {
  97. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  98. var ap = Holder.Instance;
  99. subsystem.AcceptsPerformanceLevel = true;
  100. subsystem.WarningLevel = WarningLevel.NoWarning;
  101. ap.DevicePerformanceControl.GpuLevel = -2;
  102. yield return null;
  103. Assert.AreEqual(Constants.UnknownPerformanceLevel, ap.PerformanceStatus.PerformanceMetrics.CurrentGpuLevel);
  104. }
  105. [UnityTest]
  106. public IEnumerator TemperatureChangeEvent_Values_Are_Applied()
  107. {
  108. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  109. var ap = Holder.Instance;
  110. subsystem.TemperatureLevel = 0.0f;
  111. subsystem.TemperatureTrend = 1.0f;
  112. yield return null;
  113. Assert.AreEqual(0.0f, ap.ThermalStatus.ThermalMetrics.TemperatureLevel);
  114. Assert.AreEqual(1.0f, ap.ThermalStatus.ThermalMetrics.TemperatureTrend);
  115. }
  116. [UnityTest]
  117. public IEnumerator WarningLevel_Is_Applied()
  118. {
  119. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  120. var ap = Holder.Instance;
  121. subsystem.WarningLevel = WarningLevel.ThrottlingImminent;
  122. yield return null;
  123. Assert.AreEqual(WarningLevel.ThrottlingImminent, ap.ThermalStatus.ThermalMetrics.WarningLevel);
  124. subsystem.WarningLevel = WarningLevel.Throttling;
  125. yield return null;
  126. Assert.AreEqual(WarningLevel.Throttling, ap.ThermalStatus.ThermalMetrics.WarningLevel);
  127. subsystem.WarningLevel = WarningLevel.NoWarning;
  128. yield return null;
  129. Assert.AreEqual(WarningLevel.NoWarning, ap.ThermalStatus.ThermalMetrics.WarningLevel);
  130. }
  131. [UnityTest]
  132. public IEnumerator Provider_FrameTimes_Work()
  133. {
  134. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  135. var ap = Holder.Instance;
  136. subsystem.NextGpuFrameTime = 0.033f;
  137. subsystem.NextCpuFrameTime = 0.015f;
  138. subsystem.NextOverallFrameTime = 0.042f;
  139. yield return null;
  140. var ft = ap.PerformanceStatus.FrameTiming;
  141. Assert.IsTrue(Mathf.Abs(ft.CurrentFrameTime - subsystem.NextOverallFrameTime) < 0.001f);
  142. Assert.IsTrue(Mathf.Abs(ft.CurrentCpuFrameTime - subsystem.NextCpuFrameTime) < 0.001f);
  143. Assert.IsTrue(Mathf.Abs(ft.CurrentGpuFrameTime - subsystem.NextGpuFrameTime) < 0.001f);
  144. }
  145. [UnityTest]
  146. public IEnumerator GpuBound_When_GpuTime_Is_High()
  147. {
  148. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  149. var ap = Holder.Instance;
  150. for (int i = 0; i < Constants.DefaultAverageFrameCount; ++i)
  151. {
  152. subsystem.NextGpuFrameTime = 0.040f;
  153. subsystem.NextCpuFrameTime = 0.015f;
  154. subsystem.NextOverallFrameTime = 0.042f;
  155. yield return null;
  156. }
  157. Assert.AreEqual(PerformanceBottleneck.GPU, ap.PerformanceStatus.PerformanceMetrics.PerformanceBottleneck);
  158. }
  159. [UnityTest]
  160. public IEnumerator CpuBound_When_CpuTime_Is_High()
  161. {
  162. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  163. var ap = Holder.Instance;
  164. for (int i = 0; i < Constants.DefaultAverageFrameCount; ++i)
  165. {
  166. subsystem.NextGpuFrameTime = 0.033f;
  167. subsystem.NextCpuFrameTime = 0.038f;
  168. subsystem.NextOverallFrameTime = 0.042f;
  169. yield return null;
  170. }
  171. Assert.AreEqual(PerformanceBottleneck.CPU, ap.PerformanceStatus.PerformanceMetrics.PerformanceBottleneck);
  172. }
  173. [UnityTest]
  174. public IEnumerator Unknown_Bottleneck_When_GpuTime_And_CpuTime_Are_Equal()
  175. {
  176. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  177. var ap = Holder.Instance;
  178. for (int i = 0; i < Constants.DefaultAverageFrameCount; ++i)
  179. {
  180. subsystem.NextGpuFrameTime = 0.033f;
  181. subsystem.NextCpuFrameTime = subsystem.NextGpuFrameTime;
  182. subsystem.NextOverallFrameTime = 0.042f;
  183. yield return null;
  184. }
  185. Assert.AreEqual(PerformanceBottleneck.Unknown, ap.PerformanceStatus.PerformanceMetrics.PerformanceBottleneck);
  186. }
  187. [UnityTest]
  188. public IEnumerator Bottleneck_TargetFrameRate_Works()
  189. {
  190. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  191. var ap = Holder.Instance;
  192. // There is a bug in the editor where target framerate can be 0 and the test will fail and we skip the test. -1 is default in Editor and is not supported either.
  193. if (AdaptivePerformanceManager.EffectiveTargetFrameRate() <= 0)
  194. {
  195. Assert.AreEqual(null, null);
  196. yield break;
  197. }
  198. // very low frame numbers, to avoid failing test
  199. for (int i = 0; i < Constants.DefaultAverageFrameCount; ++i)
  200. {
  201. subsystem.NextCpuFrameTime = 0.0001f;
  202. subsystem.NextGpuFrameTime = 0.0002f;
  203. subsystem.NextOverallFrameTime = 0.001f;
  204. yield return null;
  205. }
  206. Assert.AreEqual(PerformanceBottleneck.TargetFrameRate, ap.PerformanceStatus.PerformanceMetrics.PerformanceBottleneck);
  207. }
  208. [UnityTest]
  209. public IEnumerator PerformanceBottleneckChangeEvent_Works()
  210. {
  211. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  212. var ap = Holder.Instance;
  213. int eventCounter = 0;
  214. var bottleneck = PerformanceBottleneck.Unknown;
  215. // Change to Undefined bottleneck so we can have one change (as often it's defined due to the other tests)
  216. for (int i = 0; i < Constants.DefaultAverageFrameCount; ++i)
  217. {
  218. subsystem.NextCpuFrameTime = 0.4f;
  219. subsystem.NextGpuFrameTime = 0.4f;
  220. subsystem.NextOverallFrameTime = 0.9f;
  221. yield return null;
  222. }
  223. PerformanceBottleneckChangeHandler eventHandler = delegate (PerformanceBottleneckChangeEventArgs args)
  224. {
  225. ++eventCounter;
  226. bottleneck = args.PerformanceBottleneck;
  227. };
  228. ap.PerformanceStatus.PerformanceBottleneckChangeEvent += eventHandler;
  229. // very high frame numbers, to avoid failing test on very slow machines (where targetframe rate is very high
  230. for (int i = 0; i < Constants.DefaultAverageFrameCount; ++i)
  231. {
  232. subsystem.NextCpuFrameTime = 0.1f;
  233. subsystem.NextGpuFrameTime = 0.9f;
  234. subsystem.NextOverallFrameTime = 0.9f;
  235. yield return null;
  236. }
  237. Assert.AreEqual(PerformanceBottleneck.GPU, ap.PerformanceStatus.PerformanceMetrics.PerformanceBottleneck);
  238. Assert.AreEqual(PerformanceBottleneck.GPU, bottleneck);
  239. Assert.AreEqual(1, eventCounter);
  240. }
  241. [UnityTest]
  242. public IEnumerator PerformanceLevelChangeEvent_Works()
  243. {
  244. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  245. subsystem.AcceptsPerformanceLevel = true; // boost mode disables performance level acceptance and those tests can run before this.
  246. var ap = Holder.Instance;
  247. var ctrl = ap.DevicePerformanceControl;
  248. ctrl.AutomaticPerformanceControl = false;
  249. var ps = ap.PerformanceStatus;
  250. ctrl.CpuLevel = 1;
  251. ctrl.GpuLevel = 2;
  252. yield return null;
  253. Assert.AreEqual(1, ps.PerformanceMetrics.CurrentCpuLevel);
  254. Assert.AreEqual(2, ps.PerformanceMetrics.CurrentGpuLevel);
  255. var eventArgs = new PerformanceLevelChangeEventArgs();
  256. PerformanceLevelChangeHandler eventHandler = delegate (PerformanceLevelChangeEventArgs args)
  257. {
  258. eventArgs = args;
  259. };
  260. ps.PerformanceLevelChangeEvent += eventHandler;
  261. ctrl.CpuLevel = 4;
  262. ctrl.GpuLevel = 0;
  263. yield return null;
  264. Assert.AreEqual(4, ps.PerformanceMetrics.CurrentCpuLevel);
  265. Assert.AreEqual(4, eventArgs.CpuLevel);
  266. Assert.AreEqual(0, ps.PerformanceMetrics.CurrentGpuLevel);
  267. Assert.AreEqual(0, eventArgs.GpuLevel);
  268. Assert.AreEqual(3, eventArgs.CpuLevelDelta);
  269. Assert.AreEqual(-2, eventArgs.GpuLevelDelta);
  270. Assert.AreEqual(false, eventArgs.ManualOverride);
  271. Assert.AreEqual(PerformanceControlMode.Manual, eventArgs.PerformanceControlMode);
  272. }
  273. [UnityTest]
  274. public IEnumerator ThermalEvent_Works()
  275. {
  276. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  277. var ap = Holder.Instance;
  278. var thermals = ap.ThermalStatus;
  279. var metrics = new ThermalMetrics();
  280. ThermalEventHandler eventHandler = delegate (ThermalMetrics args)
  281. {
  282. metrics = args;
  283. };
  284. thermals.ThermalEvent += eventHandler;
  285. subsystem.TemperatureLevel = 0.3f;
  286. subsystem.TemperatureTrend = 0.5f;
  287. yield return null;
  288. Assert.AreEqual(0.3f, metrics.TemperatureLevel, 0.0001f);
  289. Assert.AreEqual(0.5f, metrics.TemperatureTrend, 0.0001f);
  290. }
  291. [UnityTest]
  292. public IEnumerator PerformanceLevels_Are_Reapplied_After_Timeout()
  293. {
  294. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  295. var ap = Holder.Instance;
  296. subsystem.AcceptsPerformanceLevel = true;
  297. int gpuLevel = 0;
  298. int cpuLevel = 0;
  299. ap.DevicePerformanceControl.CpuLevel = gpuLevel;
  300. ap.DevicePerformanceControl.GpuLevel = cpuLevel;
  301. yield return null;
  302. // Samsung Subsystem would do this when "timeout" happens (setLevels changes levels back to default after 10min)
  303. subsystem.GpuPerformanceLevel = Constants.UnknownPerformanceLevel;
  304. subsystem.CpuPerformanceLevel = Constants.UnknownPerformanceLevel;
  305. yield return null;
  306. // AdaptivePerformance is supposed to reapply the last settings
  307. Assert.AreEqual(cpuLevel, ap.PerformanceStatus.PerformanceMetrics.CurrentCpuLevel);
  308. Assert.AreEqual(gpuLevel, ap.PerformanceStatus.PerformanceMetrics.CurrentGpuLevel);
  309. }
  310. [UnityTest]
  311. public IEnumerator PerformanceBoostChangeEvent_Works()
  312. {
  313. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  314. var ap = Holder.Instance;
  315. var ctrl = ap.DevicePerformanceControl;
  316. var ps = ap.PerformanceStatus;
  317. ctrl.CpuPerformanceBoost = true;
  318. ctrl.GpuPerformanceBoost = true;
  319. yield return null;
  320. Assert.AreEqual(false, ps.PerformanceMetrics.CpuPerformanceBoost);
  321. Assert.AreEqual(false, ps.PerformanceMetrics.GpuPerformanceBoost);
  322. yield return null;
  323. Assert.AreEqual(true, ps.PerformanceMetrics.CpuPerformanceBoost);
  324. Assert.AreEqual(true, ps.PerformanceMetrics.GpuPerformanceBoost);
  325. var eventArgs = new PerformanceBoostChangeEventArgs();
  326. PerformanceBoostChangeHandler eventHandler = delegate (PerformanceBoostChangeEventArgs args)
  327. {
  328. eventArgs = args;
  329. };
  330. ps.PerformanceBoostChangeEvent += eventHandler;
  331. yield return null;
  332. // Samsung Subsystem would do this when "timeout" happens (enableBoost changes to no boost after 15 sec)
  333. subsystem.GpuPerformanceBoost = false;
  334. subsystem.CpuPerformanceBoost = false;
  335. Assert.AreEqual(true, ps.PerformanceMetrics.CpuPerformanceBoost);
  336. Assert.AreEqual(false, eventArgs.CpuBoost);
  337. Assert.AreEqual(true, ps.PerformanceMetrics.GpuPerformanceBoost);
  338. Assert.AreEqual(false, eventArgs.GpuBoost);
  339. yield return null;
  340. Assert.AreEqual(false, ps.PerformanceMetrics.CpuPerformanceBoost);
  341. Assert.AreEqual(false, eventArgs.CpuBoost);
  342. Assert.AreEqual(false, ps.PerformanceMetrics.GpuPerformanceBoost);
  343. Assert.AreEqual(false, eventArgs.GpuBoost);
  344. }
  345. [UnityTest]
  346. public IEnumerator PerformanceBoost_Disables_PerformanceLevels()
  347. {
  348. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  349. var ap = Holder.Instance;
  350. var ctrl = ap.DevicePerformanceControl;
  351. var ps = ap.PerformanceStatus;
  352. ctrl.CpuPerformanceBoost = true;
  353. ctrl.GpuPerformanceBoost = true;
  354. yield return null;
  355. Assert.AreEqual(false, ps.PerformanceMetrics.CpuPerformanceBoost);
  356. Assert.AreEqual(false, ps.PerformanceMetrics.GpuPerformanceBoost);
  357. yield return null;
  358. Assert.AreEqual(true, ps.PerformanceMetrics.CpuPerformanceBoost);
  359. Assert.AreEqual(true, ps.PerformanceMetrics.GpuPerformanceBoost);
  360. ap.DevicePerformanceControl.CpuLevel = 3;
  361. ap.DevicePerformanceControl.GpuLevel = 2;
  362. yield return null;
  363. // AdaptivePerformance is supposed to not apply levels when bost mode is activated
  364. Assert.AreEqual(Constants.UnknownPerformanceLevel, ap.PerformanceStatus.PerformanceMetrics.CurrentCpuLevel);
  365. Assert.AreEqual(Constants.UnknownPerformanceLevel, ap.PerformanceStatus.PerformanceMetrics.CurrentGpuLevel);
  366. }
  367. [UnityTest]
  368. public IEnumerator PerformanceBoost_Is_Off_After_Timeout()
  369. {
  370. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  371. var ap = Holder.Instance;
  372. ap.DevicePerformanceControl.GpuPerformanceBoost = true;
  373. ap.DevicePerformanceControl.CpuPerformanceBoost = true;
  374. yield return null;
  375. // Samsung Subsystem would do this when "timeout" happens (enableBoost changes to no boost after 15 sec)
  376. subsystem.GpuPerformanceBoost = false;
  377. subsystem.CpuPerformanceBoost = false;
  378. yield return null;
  379. // AdaptivePerformance is supposed to reapply the last settings
  380. Assert.AreEqual(false, ap.PerformanceStatus.PerformanceMetrics.CpuPerformanceBoost);
  381. Assert.AreEqual(false, ap.PerformanceStatus.PerformanceMetrics.GpuPerformanceBoost);
  382. }
  383. [UnityTest]
  384. public IEnumerator Feature_ClusterInfo_Is_Supported()
  385. {
  386. var subsystem = AdaptivePerformanceGeneralSettings.Instance.Manager.activeLoader.GetLoadedSubsystem<SimulatorAdaptivePerformanceSubsystem>();
  387. var ap = Holder.Instance;
  388. var clusterInfo = ap.SupportedFeature(UnityEngine.AdaptivePerformance.Provider.Feature.ClusterInfo);
  389. var bigcores = ap.PerformanceStatus.PerformanceMetrics.ClusterInfo.BigCore;
  390. var mediumcores = ap.PerformanceStatus.PerformanceMetrics.ClusterInfo.MediumCore;
  391. var tinycores = ap.PerformanceStatus.PerformanceMetrics.ClusterInfo.LittleCore;
  392. yield return null;
  393. ClusterInfo newClusterInfo = new ClusterInfo
  394. {
  395. BigCore = 5,
  396. MediumCore = 4,
  397. LittleCore = -1
  398. };
  399. subsystem.SetClusterInfo(newClusterInfo);
  400. yield return null;
  401. Assert.AreEqual(true, clusterInfo);
  402. Assert.AreEqual(bigcores, 0); // Big core is always 0 in Simulator
  403. Assert.AreEqual(mediumcores, 0); // Medium core is always 0 in Simulator
  404. Assert.AreEqual(tinycores, 0); // Small core is always 0 in Simulator
  405. Assert.AreEqual(ap.PerformanceStatus.PerformanceMetrics.ClusterInfo.BigCore, 5);
  406. Assert.AreEqual(ap.PerformanceStatus.PerformanceMetrics.ClusterInfo.MediumCore, 4);
  407. Assert.AreEqual(ap.PerformanceStatus.PerformanceMetrics.ClusterInfo.LittleCore, -1);
  408. }
  409. /// <summary>
  410. /// Verifies the Scalers available in the assembly (e.g. created as sub-types from <see cref="AdaptivePerformanceScaler "/>
  411. /// are all registered and available as Scalers in the <see cref="AdaptivePerformanceIndexer"/>.
  412. /// </summary>
  413. [UnityTest]
  414. public IEnumerator All_Scalers_Available()
  415. {
  416. var ap = Holder.Instance;
  417. var apIndexer = ap.Indexer;
  418. var ti = typeof(AdaptivePerformanceScaler);
  419. var assemblyScalers = AppDomain.CurrentDomain.GetAssemblies()
  420. .SelectMany(i => i.GetTypes())
  421. .Count(i => ti.IsAssignableFrom(i) && !i.IsAbstract);
  422. var indexedScalers = new List<AdaptivePerformanceScaler>();
  423. apIndexer.GetAllRegisteredScalers(ref indexedScalers);
  424. yield return null;
  425. Assert.AreEqual(assemblyScalers, indexedScalers.Count);
  426. }
  427. }
  428. }