This commit is contained in:
2026-08-12 08:09:16 +08:00
parent b51833499f
commit b34c0d31b1
8 changed files with 422 additions and 427 deletions
+29 -128
View File
@@ -1,5 +1,7 @@
#include "Gallery_Plot_Session.h"
#include "Gallery_Controls.h"
#include "Gallery_Enum.h"
#include "Gallery_Observer_Adminive.h"
#include "Gallery_Protocol.h"
#include "Gallery_Session_Control_Adminive.h"
#include "Pixel_Frame.h"
@@ -75,26 +77,11 @@ std::optional<double> action_number(const Gallery_Action_Request& request) {
return std::get<double>(*request.argument);
}
Frame_Control_Mode core_frame_mode(Gallery_Frame_Mode mode) {
switch (mode) {
case Gallery_Frame_Mode::Manual:
return Frame_Control_Mode::Manual;
case Gallery_Frame_Mode::Playback:
return Frame_Control_Mode::Playback;
case Gallery_Frame_Mode::Low_Latency:
return Frame_Control_Mode::Low_Latency;
}
return Frame_Control_Mode::Low_Latency;
}
std::string_view frame_mode_name(Gallery_Frame_Mode mode) {
switch (mode) {
case Gallery_Frame_Mode::Manual:
return "manual";
case Gallery_Frame_Mode::Playback:
return "playback";
case Gallery_Frame_Mode::Low_Latency:
return "low_latency";
}
return "low_latency";
const auto result = magic_enum::enum_cast<Frame_Control_Mode>(
magic_enum::enum_name(mode));
if (!result)
throw std::logic_error("Gallery frame mode has no Kernel strategy");
return *result;
}
} // namespace
class Gallery_Scene final {
@@ -118,7 +105,7 @@ public:
session_control_ = std::make_unique<Gallery_Session_Control>(
plot_, *primary_, feedback_policy_);
register_controls();
set_performance_plot_name(plot_, case_id_ + "/" + std::string(frame_mode_name(frame_mode_)));
set_performance_plot_name(plot_, case_id_ + "/" + gallery_enum_id(frame_mode_));
if (frame_mode_ == Gallery_Frame_Mode::Low_Latency)
plot_.set_max_render_fps(30.0);
plot_.activate_view();
@@ -434,9 +421,24 @@ public:
const double pixel_fps = recent_pixel_rate(pixel_history_, telemetry_now);
const double pixel_megabytes_per_second = recent_pixel_megabytes_per_second(
pixel_history_, telemetry_now);
const bool low_latency = frame_mode_ == Gallery_Frame_Mode::Low_Latency;
const Gallery_Consumer_Feedback_Snapshot consumer_feedback{
low_latency && feedback_policy_.enabled,
low_latency && feedback_policy_.pixel,
low_latency && feedback_policy_.presentation,
low_latency && feedback_policy_.manual,
low_latency ? feedback_policy_.manual_fps : 0.0,
consumer_feedback_source_,
consumer_pixel_interval_ns_,
consumer_presentation_interval_ns_,
consumer_manual_interval_ns_};
nlohmann::json observer_data =
adminive::to_frontend_json<nlohmann::json>(observer);
nlohmann::json consumer_feedback_data =
adminive::to_frontend_json<nlohmann::json>(consumer_feedback);
nlohmann::json telemetry{
{"case", case_id_},
{"frame_mode", frame_mode_name(frame_mode_)},
{"frame_mode", gallery_enum_id(frame_mode_)},
{"frame_index", frame_index_},
{
"viewport", {
@@ -467,75 +469,11 @@ public:
{
"automatic_low_latency_scheduler",
automatic_low_latency_ && frame_mode_ == Gallery_Frame_Mode::Low_Latency
},
{"kernel_paint_ms", static_cast<double>(observer.paint_duration_ns) / 1e6},
{"kernel_render_ms", static_cast<double>(observer.render_duration_ns) / 1e6},
{"kernel_bottleneck_ms", static_cast<double>(observer.bottleneck_duration_ns) / 1e6},
{"kernel_end_to_end_ms", static_cast<double>(observer.end_to_end_ns) / 1e6}
}
},
{
"kernel_observer", {
{"mode", frame_mode_name(frame_mode_)},
{"last_event", observer.last_event},
{"limit_state", observer.limit_state},
{"configured_frequency_hz", observer.frequency_hz},
{"observation_count", observer.observation_count},
{"produced_frame_count", observer.produced_frame_count},
{"consumed_frame_count", observer.consumed_frame_count},
{"dropped_frame_count", observer.dropped_frame_count},
{"failed_operation_count", observer.failed_operation_count},
{"pending_frame_count", observer.pending_frame_count},
{"latest_sequence", observer.latest_sequence},
{"paint_duration_ns", observer.paint_duration_ns},
{"render_duration_ns", observer.render_duration_ns},
{"target_interval_ns", observer.target_interval_ns},
{"frequency_limit_enabled", observer.frequency_limit_enabled},
{"consumer_feedback_enabled", observer.consumer_feedback_enabled},
{
"consumer_feedback_master_enabled",
frame_mode_ == Gallery_Frame_Mode::Low_Latency &&
feedback_policy_.enabled
},
{
"consumer_pixel_feedback_enabled",
frame_mode_ == Gallery_Frame_Mode::Low_Latency &&
feedback_policy_.pixel
},
{
"consumer_presentation_feedback_enabled",
frame_mode_ == Gallery_Frame_Mode::Low_Latency &&
feedback_policy_.presentation
},
{
"consumer_manual_feedback_enabled",
frame_mode_ == Gallery_Frame_Mode::Low_Latency &&
feedback_policy_.manual
},
{"consumer_manual_fps", frame_mode_ == Gallery_Frame_Mode::Low_Latency ? feedback_policy_.manual_fps : 0.0},
{"consumer_feedback_source", consumer_feedback_source_},
{"consumer_pixel_interval_ns", consumer_pixel_interval_ns_},
{"consumer_presentation_interval_ns", consumer_presentation_interval_ns_},
{"consumer_manual_interval_ns", consumer_manual_interval_ns_},
{"bottleneck_duration_ns", observer.bottleneck_duration_ns},
{"consumer_sample_interval_ns", observer.consumer_sample_interval_ns},
{"consumer_smoothed_interval_ns", observer.consumer_smoothed_interval_ns},
{"consumer_variation_ns", observer.consumer_variation_ns},
{"consumer_safety_interval_ns", observer.consumer_safety_interval_ns},
{"consumer_interval_ns", observer.consumer_interval_ns},
{"next_refresh_interval_ns", observer.next_refresh_interval_ns},
{"paint_lease_wait_ns", observer.paint_lease_wait_ns},
{"paint_state_wait_ns", observer.paint_state_wait_ns},
{"publish_state_wait_ns", observer.publish_state_wait_ns},
{"ready_wait_ns", observer.ready_wait_ns},
{"frame_age_at_render_ns", observer.frame_age_at_render_ns},
{"render_lease_wait_ns", observer.render_lease_wait_ns},
{"render_state_wait_ns", observer.render_state_wait_ns},
{"render_finish_state_wait_ns", observer.render_finish_state_wait_ns},
{"queue_wait_ns", observer.queue_wait_ns},
{"end_to_end_ns", observer.end_to_end_ns}
}
}
},
{"kernel_observer", std::move(observer_data)},
{"consumer_feedback", std::move(consumer_feedback_data)},
{
"client_performance", {
{"transport_fps", client_transport_fps_},
@@ -556,49 +494,12 @@ public:
},
{"last_action_result", last_action_result_}
};
if (frame_mode_ == Gallery_Frame_Mode::Low_Latency) {
telemetry["render_fps"] = plot_.max_render_fps();
telemetry["refresh_feedback_hz"] = plot_.refresh_feedback_snapshot().frequency_hz;
const auto scheduler_interval_ns = kernel_refresh_interval_ns();
telemetry["low_latency_limit"] = {
{"current", observer.limit_state},
{"frequency_limited", observer.limit_state == "frequency_limited"},
{"paint_limited", observer.limit_state == "paint_limited"},
{"render_limited", observer.limit_state == "render_limited"},
{"consumer_limited", observer.limit_state == "consumer_limited"},
{"configured_frequency_hz", observer.frequency_hz},
{"frequency_limit_enabled", observer.frequency_limit_enabled},
{"consumer_feedback_enabled", observer.consumer_feedback_enabled},
{"consumer_feedback_master_enabled", feedback_policy_.enabled},
{"consumer_pixel_feedback_enabled", feedback_policy_.pixel},
{"consumer_presentation_feedback_enabled", feedback_policy_.presentation},
{"consumer_manual_feedback_enabled", feedback_policy_.manual},
{"consumer_manual_fps", feedback_policy_.manual_fps},
{"consumer_feedback_source", consumer_feedback_source_},
{"consumer_pixel_interval_ns", consumer_pixel_interval_ns_},
{"consumer_presentation_interval_ns", consumer_presentation_interval_ns_},
{"consumer_manual_interval_ns", consumer_manual_interval_ns_},
{"target_interval_ns", observer.target_interval_ns},
{"paint_duration_ns", observer.paint_duration_ns},
{"render_duration_ns", observer.render_duration_ns},
{"bottleneck_duration_ns", observer.bottleneck_duration_ns},
{"consumer_sample_interval_ns", observer.consumer_sample_interval_ns},
{"consumer_smoothed_interval_ns", observer.consumer_smoothed_interval_ns},
{"consumer_variation_ns", observer.consumer_variation_ns},
{"consumer_safety_interval_ns", observer.consumer_safety_interval_ns},
{"consumer_interval_ns", observer.consumer_interval_ns},
{"scheduler_interval_ns", scheduler_interval_ns},
{"scheduler_frequency_hz", scheduler_interval_ns == 0 ? 0.0 : 1'000'000'000.0 / static_cast<double>(scheduler_interval_ns)}
};
}
if (primary_) {
telemetry["renderable"] = {
{"object_name", primary_->object_name()},
{"visible", primary_->is_visible()},
{
"cache_mode", primary_->get_cache_mode() == Renderable_Cache_Mode::Direct
? "Direct"
: "Local_Pixel"
"cache_mode", magic_enum::enum_name(primary_->get_cache_mode())
}
};
}
@@ -887,7 +788,7 @@ private:
{"unix_ms", unix_ms},
{"session_id", session_id_},
{"case", case_id_},
{"frame_mode", frame_mode_name(frame_mode_)},
{"frame_mode", gallery_enum_id(frame_mode_)},
{"configured_fps", low_latency ? plot_.max_render_fps() : 0.0},
{"automatic_scheduler_interval_ns", scheduler_interval_ns},
{"automatic_scheduler_fps", scheduler_interval_ns == 0 ? 0.0 : 1'000'000'000.0 / static_cast<double>(scheduler_interval_ns)},