Files
Renderive/web_server/app/Gallery_Observer_Adminive.h
T
2026-08-14 19:03:39 +08:00

239 lines
12 KiB
C++

#pragma once
#include "Gallery_Enum.h"
#include "common/Gallery_Performance_Types.h"
#include "render_2D/scene/Scene.h"
#include "render_2D/renderable/Renderable.h"
#include "adminive/adminive.hpp"
#include "adminive/adapters/magic_enum.hpp"
#include <cstdint>
#include <stdexcept>
#include <string>
namespace renderive::web {
struct Gallery_Consumer_Feedback_Snapshot {
bool master_enabled{};
bool pixel_enabled{};
bool presentation_enabled{};
bool manual_enabled{};
double manual_fps{};
std::string source;
std::uint64_t pixel_interval_ns{};
std::uint64_t presentation_interval_ns{};
std::uint64_t manual_interval_ns{};
};
struct Gallery_Render_Performance {
std::uint64_t render_attempt_count{};
std::uint64_t successful_render_count{};
std::uint64_t failed_render_count{};
double measured_fps{};
double lifetime_average_fps{};
double last_render_ms{};
double average_render_ms{};
double maximum_render_ms{};
double render_deviation_ms{};
double render_p50_ms{};
double render_p95_ms{};
double render_p99_ms{};
std::uint64_t render_sample_count{};
double pixel_response_fps{};
double last_pixel_snapshot_ms{};
double last_pixel_encode_ms{};
double average_pixel_encode_ms{};
double maximum_pixel_encode_ms{};
double pixel_encode_deviation_ms{};
double pixel_encode_p50_ms{};
double pixel_encode_p95_ms{};
double pixel_encode_p99_ms{};
std::uint64_t pixel_encode_sample_count{};
double last_pixel_request_ms{};
double average_pixel_request_ms{};
double pixel_request_deviation_ms{};
double pixel_request_p95_ms{};
double pixel_request_p99_ms{};
std::uint64_t last_pixel_bytes{};
double pixel_payload_megabytes_per_second{};
bool automatic_low_latency_scheduler{};
};
} // namespace renderive::web
namespace adminive {
template <class Json>
struct Value_Adapter<renderive::Frame_Control_Mode, Json> {
using value_type = std::string;
static std::string read(renderive::Frame_Control_Mode value) {
return renderive::web::gallery_enum_id(value);
}
static void write(renderive::Frame_Control_Mode& target, std::string value) {
const auto parsed =
renderive::web::gallery_enum_cast<renderive::Frame_Control_Mode>(value);
if (!parsed)
throw std::invalid_argument("unknown frame control mode: " + value);
target = *parsed;
}
};
template <>
struct Type_Descriptor<renderive::Frame_Observer_Snapshot> {
static auto get() {
using T = renderive::Frame_Observer_Snapshot;
return object<T>("kernel_observer",
ADMINIVE_FIELD_LABEL(T, mode, "模式")
.enum_label<renderive::Frame_Control_Mode::Manual>("手动刷新")
.enum_label<renderive::Frame_Control_Mode::Low_Latency>("低延迟")
.enum_label<renderive::Frame_Control_Mode::Playback>("回放队列"),
ADMINIVE_FIELD_LABEL(T, last_event, "最近事件"),
ADMINIVE_FIELD_LABEL(T, limit_state, "当前瓶颈"),
ADMINIVE_FIELD_LABEL(T, frequency_hz, "配置频率"),
ADMINIVE_FIELD_LABEL(T, observation_count, "观察次数"),
ADMINIVE_FIELD_LABEL(T, produced_frame_count, "发布"),
ADMINIVE_FIELD_LABEL(T, consumed_frame_count, "完成"),
ADMINIVE_FIELD_LABEL(T, dropped_frame_count, "丢弃"),
ADMINIVE_FIELD_LABEL(T, failed_operation_count, "失败"),
ADMINIVE_FIELD_LABEL(T, pending_frame_count, "待处理"),
ADMINIVE_FIELD_LABEL(T, latest_sequence, "最新序号"),
ADMINIVE_FIELD_LABEL(T, paint_duration_ns, "绘制事件耗时"),
ADMINIVE_FIELD_LABEL(T, render_duration_ns, "后台渲染"),
ADMINIVE_FIELD_LABEL(T, target_interval_ns, "目标间隔"),
ADMINIVE_FIELD_LABEL(T, frequency_limit_enabled, "频率限制"),
ADMINIVE_FIELD_LABEL(T, consumer_feedback_enabled, "内核反馈有效"),
ADMINIVE_FIELD_LABEL(T, bottleneck_duration_ns, "内部瓶颈"),
ADMINIVE_FIELD_LABEL(T, consumer_sample_interval_ns, "消费者原始采样"),
ADMINIVE_FIELD_LABEL(T, consumer_smoothed_interval_ns, "消费者平滑周期"),
ADMINIVE_FIELD_LABEL(T, consumer_variation_ns, "消费者抖动"),
ADMINIVE_FIELD_LABEL(T, consumer_safety_interval_ns, "消费者安全期限"),
ADMINIVE_FIELD_LABEL(T, consumer_interval_ns, "消费者限速周期"),
ADMINIVE_FIELD_LABEL(T, next_refresh_interval_ns, "下次刷新"),
ADMINIVE_FIELD_LABEL(T, paint_lease_wait_ns, "绘制租约等待"),
ADMINIVE_FIELD_LABEL(T, paint_state_wait_ns, "绘制状态等待"),
ADMINIVE_FIELD_LABEL(T, publish_state_wait_ns, "发布状态等待"),
ADMINIVE_FIELD_LABEL(T, ready_wait_ns, "就绪等待"),
ADMINIVE_FIELD_LABEL(T, frame_age_at_render_ns, "开始渲染时帧龄"),
ADMINIVE_FIELD_LABEL(T, render_lease_wait_ns, "渲染租约等待"),
ADMINIVE_FIELD_LABEL(T, render_state_wait_ns, "渲染状态等待"),
ADMINIVE_FIELD_LABEL(T, render_finish_state_wait_ns, "渲染完成等待"),
ADMINIVE_FIELD_LABEL(T, queue_wait_ns, "回放队列等待"),
ADMINIVE_FIELD_LABEL(T, end_to_end_ns, "端到端延迟"))
.label("内核观察器");
}
};
template <>
struct Type_Descriptor<renderive::web::Gallery_Consumer_Feedback_Snapshot> {
static auto get() {
using T = renderive::web::Gallery_Consumer_Feedback_Snapshot;
return object<T>("consumer_feedback",
ADMINIVE_FIELD_LABEL(T, master_enabled, "消费者反馈总开关"),
ADMINIVE_FIELD_LABEL(T, pixel_enabled, "像素响应反馈"),
ADMINIVE_FIELD_LABEL(T, presentation_enabled, "浏览器呈现反馈"),
ADMINIVE_FIELD_LABEL(T, manual_enabled, "手动消费者反馈"),
ADMINIVE_FIELD_LABEL(T, manual_fps, "手动消费者 FPS"),
ADMINIVE_FIELD_LABEL(T, source, "生效反馈来源"),
ADMINIVE_FIELD_LABEL(T, pixel_interval_ns, "像素响应周期"),
ADMINIVE_FIELD_LABEL(T, presentation_interval_ns, "浏览器呈现周期"),
ADMINIVE_FIELD_LABEL(T, manual_interval_ns, "手动消费者周期"))
.label("消费者反馈");
}
};
template <>
struct Type_Descriptor<renderive::web::Gallery_Render_Performance> {
static auto get() {
using T = renderive::web::Gallery_Render_Performance;
return object<T>("render_performance",
ADMINIVE_FIELD_LABEL(T, render_attempt_count, "渲染尝试"),
ADMINIVE_FIELD_LABEL(T, successful_render_count, "渲染成功"),
ADMINIVE_FIELD_LABEL(T, failed_render_count, "渲染失败"),
ADMINIVE_FIELD_LABEL(T, measured_fps, "最近渲染帧率"),
ADMINIVE_FIELD_LABEL(T, lifetime_average_fps, "平均渲染帧率"),
ADMINIVE_FIELD_LABEL(T, last_render_ms, "最近渲染耗时"),
ADMINIVE_FIELD_LABEL(T, average_render_ms, "平均渲染耗时"),
ADMINIVE_FIELD_LABEL(T, maximum_render_ms, "最大渲染耗时"),
ADMINIVE_FIELD_LABEL(T, render_deviation_ms, "渲染标准差"),
ADMINIVE_FIELD_LABEL(T, render_p50_ms, "渲染 P50"),
ADMINIVE_FIELD_LABEL(T, render_p95_ms, "渲染 P95"),
ADMINIVE_FIELD_LABEL(T, render_p99_ms, "渲染 P99"),
ADMINIVE_FIELD_LABEL(T, render_sample_count, "渲染窗口样本"),
ADMINIVE_FIELD_LABEL(T, pixel_response_fps, "像素响应帧率"),
ADMINIVE_FIELD_LABEL(T, last_pixel_snapshot_ms, "最近像素快照耗时"),
ADMINIVE_FIELD_LABEL(T, last_pixel_encode_ms, "最近像素编码耗时"),
ADMINIVE_FIELD_LABEL(T, average_pixel_encode_ms, "平均像素编码耗时"),
ADMINIVE_FIELD_LABEL(T, maximum_pixel_encode_ms, "最大像素编码耗时"),
ADMINIVE_FIELD_LABEL(T, pixel_encode_deviation_ms, "像素编码标准差"),
ADMINIVE_FIELD_LABEL(T, pixel_encode_p50_ms, "像素编码 P50"),
ADMINIVE_FIELD_LABEL(T, pixel_encode_p95_ms, "像素编码 P95"),
ADMINIVE_FIELD_LABEL(T, pixel_encode_p99_ms, "像素编码 P99"),
ADMINIVE_FIELD_LABEL(T, pixel_encode_sample_count, "像素编码窗口样本"),
ADMINIVE_FIELD_LABEL(T, last_pixel_request_ms, "最近像素请求耗时"),
ADMINIVE_FIELD_LABEL(T, average_pixel_request_ms, "像素请求滑动平均"),
ADMINIVE_FIELD_LABEL(T, pixel_request_deviation_ms, "像素请求标准差"),
ADMINIVE_FIELD_LABEL(T, pixel_request_p95_ms, "像素请求 P95"),
ADMINIVE_FIELD_LABEL(T, pixel_request_p99_ms, "像素请求 P99"),
ADMINIVE_FIELD_LABEL(T, last_pixel_bytes, "最近像素负载"),
ADMINIVE_FIELD_LABEL(T, pixel_payload_megabytes_per_second, "像素负载吞吐"),
ADMINIVE_FIELD_LABEL(T, automatic_low_latency_scheduler, "自动低延迟调度"))
.label("渲染性能");
}
};
template <>
struct Type_Descriptor<renderive::web::Gallery_Client_Performance> {
static auto get() {
using T = renderive::web::Gallery_Client_Performance;
return object<T>("client_performance",
ADMINIVE_FIELD_LABEL(T, transport_fps, "像素响应帧率"),
ADMINIVE_FIELD_LABEL(T, presentation_fps, "浏览器呈现帧率"),
ADMINIVE_FIELD_LABEL(T, websocket_buffered_bytes, "WebSocket 缓冲"),
ADMINIVE_FIELD_LABEL(T, changed_pixel_frames, "变化像素帧"),
ADMINIVE_FIELD_LABEL(T, duplicate_pixel_frames, "重复像素帧"),
ADMINIVE_FIELD_LABEL(T, frame_request_timeout_count, "像素请求超时"),
ADMINIVE_FIELD_LABEL(T, frame_round_trip_ms, "WebSocket 往返耗时"),
ADMINIVE_FIELD_LABEL(T, frame_round_trip_average_ms, "WebSocket 往返滑动平均"),
ADMINIVE_FIELD_LABEL(T, frame_round_trip_deviation_ms, "WebSocket 往返标准差"),
ADMINIVE_FIELD_LABEL(T, frame_round_trip_p95_ms, "WebSocket 往返 P95"),
ADMINIVE_FIELD_LABEL(T, frame_round_trip_p99_ms, "WebSocket 往返 P99"),
ADMINIVE_FIELD_LABEL(T, display_interval_ms, "呈现中位周期"),
ADMINIVE_FIELD_LABEL(T, display_interval_average_ms, "呈现滑动平均周期"),
ADMINIVE_FIELD_LABEL(T, display_interval_latest_ms, "最近呈现周期"),
ADMINIVE_FIELD_LABEL(T, display_interval_p95_ms, "呈现 P95 周期"),
ADMINIVE_FIELD_LABEL(T, display_interval_p99_ms, "呈现 P99 周期"),
ADMINIVE_FIELD_LABEL(T, display_interval_deviation_ms, "呈现周期标准差"),
ADMINIVE_FIELD_LABEL(T, overwritten_pixel_frames, "未呈现覆盖帧"),
ADMINIVE_FIELD_LABEL(T, last_pixel_receive_age_ms, "最近像素龄"),
ADMINIVE_FIELD_LABEL(T, last_pixel_change_age_ms, "最近变化龄"))
.label("浏览器性能");
}
};
template <>
struct Type_Descriptor<renderive::Renderable_Observation> {
static auto get() {
using T = renderive::Renderable_Observation;
return object<T>("renderable_observer",
ADMINIVE_FIELD_LABEL(T, event, "最近状态事件")
.enum_label<renderive::Renderable_Observer_Event::None>("尚无事件")
.enum_label<renderive::Renderable_Observer_Event::Cache_Updated>("缓存状态已更新")
.enum_label<renderive::Renderable_Observer_Event::Published>("渲染状态已发布"),
ADMINIVE_FIELD_LABEL(T, event_time_ns, "事件时间"),
ADMINIVE_FIELD_LABEL(T, cache_update_count, "缓存更新次数"),
ADMINIVE_FIELD_LABEL(T, publish_count, "状态发布次数"))
.label("渲染对象观察器");
}
};
static_assert(Described_Type<renderive::Frame_Observer_Snapshot>);
static_assert(Described_Type<renderive::web::Gallery_Consumer_Feedback_Snapshot>);
static_assert(Described_Type<renderive::web::Gallery_Render_Performance>);
static_assert(Described_Type<renderive::web::Gallery_Client_Performance>);
static_assert(Described_Type<renderive::Renderable_Observation>);
} // namespace adminive