架构微调
This commit is contained in:
+1
-1
@@ -73,7 +73,7 @@ TEST(low_latency_pipeline_test, consumer_feedback_limits_refresh_without_knowing
|
||||
EXPECT_EQ(state.target_interval_ns, 10'000'000u);
|
||||
EXPECT_EQ(state.consumer_interval_ns, 40'000'000u);
|
||||
EXPECT_EQ(state.next_refresh_interval_ns, 40'000'000u);
|
||||
strategy.set_consumer_feedback({});
|
||||
strategy.clear_consumer_feedback();
|
||||
state = strategy.state();
|
||||
EXPECT_EQ(state.limit_state, Low_Latency_Test_Strategy::Limit_State::frequency_limited);
|
||||
EXPECT_EQ(state.consumer_interval_ns, 0u);
|
||||
|
||||
+62
@@ -125,3 +125,65 @@ TEST(low_latency_strategy_test, clamps_extremely_small_frequency_interval_withou
|
||||
}
|
||||
EXPECT_EQ(strategy.state().target_interval_ns, std::numeric_limits<std::uint64_t>::max());
|
||||
}
|
||||
TEST(low_latency_strategy_test, smooths_consumer_feedback_in_kernel) {
|
||||
Low_Latency_Test_Time_Source time_source;
|
||||
Low_Latency_Test_Observer observer;
|
||||
auto strategy = make_low_latency_test_strategy(time_source, observer);
|
||||
strategy.set_frequency_hz(1000.0);
|
||||
strategy.set_consumer_feedback({10'000'000});
|
||||
auto state = strategy.state();
|
||||
EXPECT_TRUE(state.consumer_feedback_enabled);
|
||||
EXPECT_EQ(state.consumer_sample_interval_ns, 10'000'000u);
|
||||
EXPECT_EQ(state.consumer_smoothed_interval_ns, 10'000'000u);
|
||||
EXPECT_EQ(state.consumer_variation_ns, 0u);
|
||||
EXPECT_EQ(state.consumer_interval_ns, 10'000'000u);
|
||||
strategy.set_consumer_feedback({14'000'000});
|
||||
state = strategy.state();
|
||||
EXPECT_EQ(state.consumer_sample_interval_ns, 14'000'000u);
|
||||
EXPECT_EQ(state.consumer_smoothed_interval_ns, 10'500'000u);
|
||||
EXPECT_EQ(state.consumer_variation_ns, 1'000'000u);
|
||||
EXPECT_EQ(state.consumer_interval_ns, 14'500'000u);
|
||||
EXPECT_EQ(state.limit_state, Low_Latency_Test_Strategy::Limit_State::consumer_limited);
|
||||
}
|
||||
TEST(low_latency_strategy_test, allows_frequency_and_consumer_limits_to_be_cleared) {
|
||||
Low_Latency_Test_Time_Source time_source;
|
||||
Low_Latency_Test_Observer observer;
|
||||
auto strategy = make_low_latency_test_strategy(time_source, observer);
|
||||
strategy.set_frequency_hz(1000.0);
|
||||
strategy.set_consumer_feedback({20'000'000});
|
||||
strategy.clear_consumer_feedback();
|
||||
auto state = strategy.state();
|
||||
EXPECT_FALSE(state.consumer_feedback_enabled);
|
||||
EXPECT_EQ(state.consumer_interval_ns, 0u);
|
||||
EXPECT_EQ(state.limit_state, Low_Latency_Test_Strategy::Limit_State::frequency_limited);
|
||||
strategy.clear_frequency_limit();
|
||||
state = strategy.state();
|
||||
EXPECT_FALSE(state.frequency_limit_enabled);
|
||||
EXPECT_TRUE(std::isnan(state.frequency_hz));
|
||||
EXPECT_EQ(state.target_interval_ns, 0u);
|
||||
EXPECT_EQ(state.next_refresh_interval_ns, 0u);
|
||||
EXPECT_EQ(state.limit_state, Low_Latency_Test_Strategy::Limit_State::unlimited);
|
||||
}
|
||||
TEST(low_latency_strategy_test, unlimited_mode_runs_at_measured_render_bottleneck) {
|
||||
Low_Latency_Test_Time_Source time_source;
|
||||
Low_Latency_Test_Observer observer;
|
||||
auto strategy = make_low_latency_test_strategy(time_source, observer);
|
||||
strategy.clear_frequency_limit();
|
||||
strategy.clear_consumer_feedback();
|
||||
{
|
||||
auto frame = strategy.acquire_painter();
|
||||
time_source.advance_ns(2'000);
|
||||
frame->value = 1;
|
||||
}
|
||||
{
|
||||
auto frame = strategy.acquire_renderer();
|
||||
ASSERT_TRUE(frame);
|
||||
time_source.advance_ns(5'000);
|
||||
}
|
||||
const auto state = strategy.state();
|
||||
EXPECT_EQ(state.target_interval_ns, 0u);
|
||||
EXPECT_EQ(state.consumer_interval_ns, 0u);
|
||||
EXPECT_EQ(state.bottleneck_duration_ns, 5'000u);
|
||||
EXPECT_EQ(state.next_refresh_interval_ns, 5'000u);
|
||||
EXPECT_EQ(state.limit_state, Low_Latency_Test_Strategy::Limit_State::render_limited);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user