架构微调

This commit is contained in:
2026-08-11 10:01:17 +08:00
parent 996e6f6154
commit 37bb77d280
13 changed files with 258 additions and 45 deletions
@@ -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);
@@ -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);
}