修复若干问题

This commit is contained in:
2026-08-15 03:21:01 +08:00
parent 04a9156cd6
commit 6655e8571b
54 changed files with 1525 additions and 397 deletions
+31 -26
View File
@@ -143,12 +143,24 @@ std::optional<double> action_number(const Gallery_Action_Request& request) {
return std::nullopt;
return std::get<double>(*request.argument);
}
Plot_Frame_Mode plot_frame_mode(Gallery_Frame_Mode mode) {
switch (mode) {
case Gallery_Frame_Mode::Manual:
return Plot_Frame_Mode::Manual;
case Gallery_Frame_Mode::Low_Latency:
return Plot_Frame_Mode::Low_Latency;
case Gallery_Frame_Mode::Playback:
return Plot_Frame_Mode::Playback;
}
throw std::invalid_argument("unknown gallery frame mode");
}
} // namespace
template <class Scene_Type>
class Gallery_Scene final : public Gallery_Scene_Interface {
public:
Gallery_Scene(std::uint64_t session_id, std::string case_id, Gallery_Frame_Mode frame_mode, bool automatic_low_latency)
: session_id_(session_id), case_id_(std::move(case_id)), frame_mode_(frame_mode), automatic_low_latency_(automatic_low_latency), performance_started_(std::chrono::steady_clock::now()) {
: session_id_(session_id), case_id_(std::move(case_id)), frame_mode_(frame_mode), automatic_low_latency_(automatic_low_latency),
plot_(Plot_Scene_Options{plot_frame_mode(frame_mode)}), performance_started_(std::chrono::steady_clock::now()) {
plot_.init();
plot_.set_viewport_size({560, 320});
root_ = plot_.root_renderable();
@@ -172,7 +184,7 @@ public:
}
attach_performance_overlay(plot_);
apply_layout();
session_control_ = std::make_unique<Gallery_Session_Control<Scene_Type>>(
session_control_ = std::make_unique<Gallery_Session_Control<Plot_Scene>>(
plot_, *primary_, feedback_policy_);
register_controls();
set_performance_plot_name(plot_, case_id_ + "/" + gallery_enum_id(frame_mode_));
@@ -193,9 +205,9 @@ public:
[[nodiscard]] nlohmann::json controls() const {
return {
{"resources", controls_.resources()},
{"observers", controls_.observers(plot_)},
{"render_plan", controls_.render_plan(plot_)},
{"performance_capture", gallery_performance_capture_json(plot_)}
{"observers", controls_.observers(plot_.render_scene())},
{"render_plan", controls_.render_plan(plot_.render_scene())},
{"performance_capture", gallery_performance_capture_json(plot_.render_scene())}
};
}
[[nodiscard]] Gallery_Frame_Mode frame_mode() const noexcept {
@@ -262,7 +274,7 @@ public:
}
apply_layout();
update_model();
plot_.notify_model_dirty();
plot_.request_redraw();
return result;
}
void resize(int width, int height) override {
@@ -351,10 +363,10 @@ public:
last_action_result_.clear();
recognized = true;
if (request.id == "capture_next_frame") {
const auto state = plot_.capture_state();
const auto state = plot_.render_scene().capture_state();
if (state.enabled())
return "A performance capture session is already active";
const auto session_id = plot_.capture_next_frame();
const auto session_id = plot_.render_scene().capture_next_frame();
last_action_result_ = "capture session=" + std::to_string(session_id);
return "Capture next render frame requested";
}
@@ -364,10 +376,10 @@ public:
return invalid_argument(recognized);
const std::size_t count = static_cast<std::size_t>(
std::clamp(std::llround(*argument), 1LL, 1000LL));
const auto state = plot_.capture_state();
const auto state = plot_.render_scene().capture_state();
if (state.enabled())
return "A performance capture session is already active";
const auto session_id = plot_.capture_frames(count);
const auto session_id = plot_.render_scene().capture_frames(count);
last_action_result_ = "capture session=" + std::to_string(session_id) +
", frames=" + std::to_string(count);
return "Consecutive render frame capture requested";
@@ -557,7 +569,7 @@ public:
last_action_result_ = notice;
}
[[nodiscard]] std::string telemetry_json() const {
const auto observer = plot_.frame_observer_snapshot();
const auto observer = plot_.frame_status();
const auto telemetry_now = std::chrono::steady_clock::now();
const double elapsed_seconds = std::max(
std::chrono::duration<double>(telemetry_now - performance_started_).count(),
@@ -641,8 +653,8 @@ public:
{"kernel_observer", std::move(observer_data)},
{"consumer_feedback", std::move(consumer_feedback_data)},
{"client_performance", std::move(client_performance_data)},
{"renderable_observers", controls_.observers(plot_)},
{"performance_capture", gallery_performance_capture_json(plot_)},
{"renderable_observers", controls_.observers(plot_.render_scene())},
{"performance_capture", gallery_performance_capture_json(plot_.render_scene())},
{"last_action_result", last_action_result_}
};
if (primary_) {
@@ -925,7 +937,7 @@ private:
if (now - last_performance_log_ < std::chrono::seconds(1))
return;
last_performance_log_ = now;
const auto observer = plot_.frame_observer_snapshot();
const auto observer = plot_.frame_status();
const auto unix_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now().time_since_epoch())
.count();
@@ -1344,9 +1356,9 @@ private:
std::string case_id_;
Gallery_Frame_Mode frame_mode_ = Gallery_Frame_Mode::Low_Latency;
bool automatic_low_latency_{};
Scene_Type plot_;
Plot_Scene plot_;
Gallery_Feedback_Policy feedback_policy_;
std::unique_ptr<Gallery_Session_Control<Scene_Type>> session_control_;
std::unique_ptr<Gallery_Session_Control<Plot_Scene>> session_control_;
Gallery_Controls controls_;
std::chrono::steady_clock::time_point performance_started_;
std::chrono::steady_clock::time_point last_performance_log_;
@@ -1389,14 +1401,7 @@ private:
std::string last_action_result_;
};
std::unique_ptr<Gallery_Scene_Interface> make_gallery_scene_2d(std::uint64_t session_id, std::string case_id, Gallery_Frame_Mode mode, bool automatic_low_latency) {
switch (mode) {
case Gallery_Frame_Mode::Manual:
return std::make_unique<Gallery_Scene<Manual_Scene2D>>(session_id, std::move(case_id), mode, automatic_low_latency);
case Gallery_Frame_Mode::Low_Latency:
return std::make_unique<Gallery_Scene<Scene2D>>(session_id, std::move(case_id), mode, automatic_low_latency);
case Gallery_Frame_Mode::Playback:
return std::make_unique<Gallery_Scene<Playback_Scene2D>>(session_id, std::move(case_id), mode, automatic_low_latency);
}
throw std::invalid_argument("unknown gallery frame mode");
return std::make_unique<Gallery_Scene>(session_id, std::move(case_id),
mode, automatic_low_latency);
}
}