battle_render_optimizer_test.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #include "render/battle_render_optimizer.h"
  2. #include <gtest/gtest.h>
  3. using namespace Render;
  4. class BattleRenderOptimizerTest : public ::testing::Test {
  5. protected:
  6. void SetUp() override {
  7. auto &optimizer = BattleRenderOptimizer::instance();
  8. BattleRenderConfig config;
  9. config.temporal_culling_threshold = 15;
  10. config.animation_throttle_threshold = 30;
  11. config.animation_throttle_distance = 40.0F;
  12. config.animation_skip_frames = 2;
  13. config.enabled = true;
  14. optimizer.set_config(config);
  15. }
  16. };
  17. TEST_F(BattleRenderOptimizerTest, DisabledOptimizerAlwaysRendersUnits) {
  18. auto &optimizer = BattleRenderOptimizer::instance();
  19. BattleRenderConfig config = optimizer.config();
  20. config.enabled = false;
  21. optimizer.set_config(config);
  22. optimizer.set_visible_unit_count(100);
  23. optimizer.begin_frame();
  24. EXPECT_TRUE(optimizer.should_render_unit(1, false, false, false));
  25. EXPECT_TRUE(optimizer.should_render_unit(2, false, false, false));
  26. EXPECT_TRUE(optimizer.should_render_unit(3, false, false, false));
  27. }
  28. TEST_F(BattleRenderOptimizerTest, SelectedUnitsAlwaysRender) {
  29. auto &optimizer = BattleRenderOptimizer::instance();
  30. optimizer.set_visible_unit_count(100);
  31. optimizer.begin_frame();
  32. EXPECT_TRUE(optimizer.should_render_unit(1, false, true, false));
  33. EXPECT_TRUE(optimizer.should_render_unit(2, false, true, false));
  34. }
  35. TEST_F(BattleRenderOptimizerTest, HoveredUnitsAlwaysRender) {
  36. auto &optimizer = BattleRenderOptimizer::instance();
  37. optimizer.set_visible_unit_count(100);
  38. optimizer.begin_frame();
  39. EXPECT_TRUE(optimizer.should_render_unit(1, false, false, true));
  40. EXPECT_TRUE(optimizer.should_render_unit(2, false, false, true));
  41. }
  42. TEST_F(BattleRenderOptimizerTest, MovingUnitsAlwaysRender) {
  43. auto &optimizer = BattleRenderOptimizer::instance();
  44. optimizer.set_visible_unit_count(100);
  45. optimizer.begin_frame();
  46. EXPECT_TRUE(optimizer.should_render_unit(1, true, false, false));
  47. EXPECT_TRUE(optimizer.should_render_unit(2, true, false, false));
  48. }
  49. TEST_F(BattleRenderOptimizerTest, BelowThresholdAlwaysRenders) {
  50. auto &optimizer = BattleRenderOptimizer::instance();
  51. optimizer.set_visible_unit_count(10);
  52. optimizer.begin_frame();
  53. EXPECT_TRUE(optimizer.should_render_unit(1, false, false, false));
  54. EXPECT_TRUE(optimizer.should_render_unit(2, false, false, false));
  55. EXPECT_TRUE(optimizer.should_render_unit(3, false, false, false));
  56. }
  57. TEST_F(BattleRenderOptimizerTest, AboveThresholdSkipsIdleUnitsAlternately) {
  58. auto &optimizer = BattleRenderOptimizer::instance();
  59. optimizer.set_visible_unit_count(100);
  60. optimizer.begin_frame();
  61. uint32_t frame = optimizer.frame_counter();
  62. bool unit1_render = optimizer.should_render_unit(1, false, false, false);
  63. bool unit2_render = optimizer.should_render_unit(2, false, false, false);
  64. EXPECT_NE(unit1_render, unit2_render);
  65. }
  66. TEST_F(BattleRenderOptimizerTest, TemporalCullingAlternatesBetweenFrames) {
  67. auto &optimizer = BattleRenderOptimizer::instance();
  68. optimizer.set_visible_unit_count(100);
  69. optimizer.begin_frame();
  70. bool frame1_result = optimizer.should_render_unit(1, false, false, false);
  71. optimizer.begin_frame();
  72. bool frame2_result = optimizer.should_render_unit(1, false, false, false);
  73. EXPECT_NE(frame1_result, frame2_result);
  74. }
  75. TEST_F(BattleRenderOptimizerTest,
  76. AnimationThrottlingBelowThresholdAlwaysUpdates) {
  77. auto &optimizer = BattleRenderOptimizer::instance();
  78. optimizer.set_visible_unit_count(20);
  79. optimizer.begin_frame();
  80. EXPECT_TRUE(optimizer.should_update_animation(1, 100.0F, false));
  81. EXPECT_TRUE(optimizer.should_update_animation(2, 100.0F, false));
  82. }
  83. TEST_F(BattleRenderOptimizerTest, AnimationThrottlingSelectedAlwaysUpdates) {
  84. auto &optimizer = BattleRenderOptimizer::instance();
  85. optimizer.set_visible_unit_count(100);
  86. optimizer.begin_frame();
  87. EXPECT_TRUE(optimizer.should_update_animation(1, 100.0F, true));
  88. EXPECT_TRUE(optimizer.should_update_animation(2, 100.0F, true));
  89. }
  90. TEST_F(BattleRenderOptimizerTest, AnimationThrottlingCloseUnitsAlwaysUpdate) {
  91. auto &optimizer = BattleRenderOptimizer::instance();
  92. optimizer.set_visible_unit_count(100);
  93. optimizer.begin_frame();
  94. EXPECT_TRUE(optimizer.should_update_animation(1, 10.0F, false));
  95. EXPECT_TRUE(optimizer.should_update_animation(2, 30.0F, false));
  96. }
  97. TEST_F(BattleRenderOptimizerTest, AnimationThrottlingDistantUnitsThrottled) {
  98. auto &optimizer = BattleRenderOptimizer::instance();
  99. optimizer.set_visible_unit_count(100);
  100. int updated = 0;
  101. int throttled = 0;
  102. for (int frame = 0; frame < 6; ++frame) {
  103. optimizer.begin_frame();
  104. if (optimizer.should_update_animation(1, 100.0F, false)) {
  105. ++updated;
  106. } else {
  107. ++throttled;
  108. }
  109. }
  110. EXPECT_GT(throttled, 0);
  111. EXPECT_GT(updated, 0);
  112. }
  113. TEST_F(BattleRenderOptimizerTest, BatchingBoostIncreasesWithUnitCount) {
  114. auto &optimizer = BattleRenderOptimizer::instance();
  115. optimizer.set_visible_unit_count(10);
  116. float boost_low = optimizer.get_batching_boost();
  117. optimizer.set_visible_unit_count(30);
  118. float boost_high = optimizer.get_batching_boost();
  119. EXPECT_FLOAT_EQ(boost_low, 1.0F);
  120. EXPECT_GT(boost_high, 1.0F);
  121. }
  122. TEST_F(BattleRenderOptimizerTest, IsBattleModeDetectsBattles) {
  123. auto &optimizer = BattleRenderOptimizer::instance();
  124. optimizer.set_visible_unit_count(10);
  125. EXPECT_FALSE(optimizer.is_battle_mode());
  126. optimizer.set_visible_unit_count(20);
  127. EXPECT_TRUE(optimizer.is_battle_mode());
  128. }
  129. TEST_F(BattleRenderOptimizerTest, FrameCounterIncrements) {
  130. auto &optimizer = BattleRenderOptimizer::instance();
  131. uint32_t frame1 = optimizer.frame_counter();
  132. optimizer.begin_frame();
  133. uint32_t frame2 = optimizer.frame_counter();
  134. EXPECT_EQ(frame2, frame1 + 1);
  135. }
  136. TEST_F(BattleRenderOptimizerTest, StatsResetOnBeginFrame) {
  137. auto &optimizer = BattleRenderOptimizer::instance();
  138. optimizer.set_visible_unit_count(100);
  139. optimizer.begin_frame();
  140. optimizer.should_render_unit(1, false, false, false);
  141. optimizer.should_render_unit(2, false, false, false);
  142. optimizer.begin_frame();
  143. EXPECT_EQ(optimizer.units_rendered_this_frame(), 0);
  144. EXPECT_EQ(optimizer.units_skipped_temporal(), 0);
  145. EXPECT_EQ(optimizer.animations_throttled(), 0);
  146. }