架构微调
This commit is contained in:
@@ -975,6 +975,85 @@ TEST(RenderiveWebGallery, LowLatencyStrategyKeepsForegroundResponsiveUnderAggres
|
||||
observer.at("limit_state") == "consumer_limited");
|
||||
}
|
||||
|
||||
TEST(RenderiveWebGallery, FrequencyLimitCannotBeBypassedByForegroundRescheduleEvents) {
|
||||
Gallery_Plot_Session session(true);
|
||||
ASSERT_EQ(response_json(session.handle(gallery_request(
|
||||
Gallery_Request_Kind::Open, open_message("spectrum", "low_latency")))).at("type"),
|
||||
"case_state");
|
||||
const auto patched = patch_controls(session, {
|
||||
{"frequency_limit_enabled", true},
|
||||
{"max_render_fps", 30.0},
|
||||
{"consumer_feedback_enabled", false}
|
||||
});
|
||||
ASSERT_EQ(patched.at("type"), "case_state");
|
||||
const auto& patched_observer = patched.at("telemetry").at("kernel_observer");
|
||||
EXPECT_TRUE(patched_observer.at("frequency_limit_enabled").get<bool>());
|
||||
EXPECT_FALSE(patched_observer.at("consumer_feedback_enabled").get<bool>());
|
||||
EXPECT_EQ(patched_observer.at("target_interval_ns"), 33'333'333);
|
||||
ASSERT_TRUE(wait_for_condition([&session] {
|
||||
return successful_render_count(session) >= 3;
|
||||
}));
|
||||
const auto pointer = Web_Event_Adapter::decode(
|
||||
R"({"category":"event","type":"pointer_move","x":320,"y":180,"button":"none","buttons":0,"modifiers":0})");
|
||||
ASSERT_TRUE(pointer.has_value());
|
||||
const auto before = successful_render_count(session);
|
||||
const auto started = std::chrono::steady_clock::now();
|
||||
const auto deadline = started + std::chrono::milliseconds(450);
|
||||
while (std::chrono::steady_clock::now() < deadline) {
|
||||
EXPECT_FALSE(session.handle(*pointer).has_value());
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(2));
|
||||
}
|
||||
const auto elapsed = std::chrono::steady_clock::now() - started;
|
||||
const auto after = successful_render_count(session);
|
||||
const auto rendered = after - before;
|
||||
EXPECT_GT(rendered, 0U);
|
||||
EXPECT_LE(rendered, 16U);
|
||||
const auto telemetry = observe_telemetry(session);
|
||||
const auto& observer = telemetry.at("kernel_observer");
|
||||
EXPECT_EQ(observer.at("target_interval_ns"), 33'333'333);
|
||||
EXPECT_GE(observer.at("next_refresh_interval_ns").get<std::uint64_t>(), 33'333'333U);
|
||||
EXPECT_GE(elapsed, std::chrono::milliseconds(450));
|
||||
}
|
||||
|
||||
TEST(RenderiveWebGallery, ConsumerFeedbackCannotBeBypassedByForegroundRescheduleEvents) {
|
||||
Gallery_Plot_Session session(true);
|
||||
ASSERT_EQ(response_json(session.handle(gallery_request(
|
||||
Gallery_Request_Kind::Open, open_message("spectrum", "low_latency")))).at("type"),
|
||||
"case_state");
|
||||
ASSERT_EQ(patch_controls(session, {
|
||||
{"frequency_limit_enabled", false},
|
||||
{"consumer_feedback_enabled", true}
|
||||
}).at("type"), "case_state");
|
||||
auto observed = response_json(session.handle(gallery_request(
|
||||
Gallery_Request_Kind::Observe,
|
||||
R"({"category":"event","type":"gallery_observe","client_metrics":{"transport_fps":25,"presentation_fps":25,"websocket_buffered_bytes":0,"changed_pixel_frames":1,"duplicate_pixel_frames":0,"frame_request_timeout_count":0,"frame_round_trip_ms":5,"display_interval_ms":40,"overwritten_pixel_frames":0,"last_pixel_receive_age_ms":1,"last_pixel_change_age_ms":1}})")));
|
||||
auto observer = observed.at("telemetry").at("kernel_observer");
|
||||
EXPECT_FALSE(observer.at("frequency_limit_enabled").get<bool>());
|
||||
EXPECT_TRUE(observer.at("consumer_feedback_enabled").get<bool>());
|
||||
EXPECT_EQ(observer.at("consumer_interval_ns"), 40'000'000);
|
||||
ASSERT_TRUE(wait_for_condition([&session] {
|
||||
return successful_render_count(session) >= 3;
|
||||
}));
|
||||
const auto pointer = Web_Event_Adapter::decode(
|
||||
R"({"category":"event","type":"pointer_move","x":320,"y":180,"button":"none","buttons":0,"modifiers":0})");
|
||||
ASSERT_TRUE(pointer.has_value());
|
||||
const auto before = successful_render_count(session);
|
||||
const auto started = std::chrono::steady_clock::now();
|
||||
const auto deadline = started + std::chrono::milliseconds(450);
|
||||
while (std::chrono::steady_clock::now() < deadline) {
|
||||
EXPECT_FALSE(session.handle(*pointer).has_value());
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(2));
|
||||
}
|
||||
const auto after = successful_render_count(session);
|
||||
const auto rendered = after - before;
|
||||
EXPECT_GT(rendered, 0U);
|
||||
EXPECT_LE(rendered, 14U);
|
||||
observed = observe_telemetry(session);
|
||||
observer = observed.at("kernel_observer");
|
||||
EXPECT_EQ(observer.at("consumer_interval_ns"), 40'000'000);
|
||||
EXPECT_GE(observer.at("next_refresh_interval_ns").get<std::uint64_t>(), 40'000'000U);
|
||||
}
|
||||
|
||||
TEST(RenderiveWebGallery, WebRuntimeMetricsPublishKernelSmoothedConsumerFeedbackWithoutTransportFpsCap) {
|
||||
Gallery_Plot_Session session(true);
|
||||
ASSERT_EQ(response_json(session.handle(gallery_request(
|
||||
|
||||
Reference in New Issue
Block a user