feat(render): journal du rendu lance par Studio et images lentes signalees

Studio host passe --render-log (run\render-<port>.log) au Core ; sequa-render journalise toute image de plus de 250 ms avec la repartition du temps, pour diagnostiquer les fenetres Godot qui ne repondent plus.
This commit is contained in:
Ange-Marie MAURIN - A2M Systèmes committed 2026-11-07 16:46:29 +01:00
1 parent 815192918d
commit f039fabdd0
2 files changed
+22

No files matched your search

+20
View File
@@ -168,7 +168,16 @@ int run(const Options& options)
: std::chrono::microseconds(0);
auto next_frame = Clock::now();
// Diagnostic : une image de plus de 250 ms est journalisée avec la répartition du temps
// (une fenêtre bloquée plus de 5 s est marquée « ne répond pas » par Windows).
constexpr auto slow_frame = std::chrono::milliseconds(250);
const auto ms_between = [](Clock::time_point from, Clock::time_point to) {
return static_cast<long long>(std::chrono::duration_cast<std::chrono::milliseconds>(to - from).count());
};
for (std::uint64_t frame = 0;; ++frame) {
const auto t_begin = Clock::now();
std::size_t deltas = 0;
for (render::CoreEvent& event : link.poll()) {
if (auto* received = std::get_if<render::ReceivedDelta>(&event)) {
three_d::wire::SceneDeltaMessage* message = &received->message;
@@ -182,6 +191,7 @@ int run(const Options& options)
report_failure(link, "invalid-delta", error->message);
return exit_startup;
}
++deltas;
const std::uint64_t sent = message->sent_at_us;
const std::uint64_t now = render::monotonic_us();
latency_us.push_back(received->received_at_us > sent ? received->received_at_us - sent : 0);
@@ -202,6 +212,7 @@ int run(const Options& options)
return exit_lease;
}
const auto t_polled = Clock::now();
three_d::FrameRequest request;
request.frame_index = frame;
request.world_version = mirror.world_version();
@@ -216,6 +227,15 @@ int run(const Options& options)
report_failure(link, "render-frame", error->message);
return exit_startup;
}
const auto t_rendered = Clock::now();
if (t_rendered - t_begin > slow_frame) {
std::fprintf(stderr,
"sequa-render : image %llu lente, %lld ms (deltas recus et appliques : %zu en %lld ms, "
"image du moteur : %lld ms)\n",
static_cast<unsigned long long>(frame), ms_between(t_begin, t_rendered), deltas,
ms_between(t_begin, t_polled), ms_between(t_polled, t_rendered));
std::fflush(stderr);
}
cpu_ms.push_back(std::get<three_d::FrameResult>(outcome).measurements.cpu_ms);
++frames_since_report;
+2
View File
@@ -142,6 +142,8 @@ std::string StudioHost::launch_core()
for (const std::string& origin : config_.allowed_origins) {
args.insert(args.end(), {"--allowed-origin", origin});
}
// Journal du processus de rendu (Godot compris), à côté de celui du Core.
args.insert(args.end(), {"--render-log", sequa::platform::path_to_utf8(config_.run_dir / ("render-" + std::to_string(config_.core_port) + ".log"))});
LaunchOptions launch;
launch.own_console = config_.core_console;
launch.log_path = log_file_path(config_.run_dir, config_.core_port);