From f039fabdd03cc423609df33e01b49799b7853aa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ange-Marie=20MAURIN=20-=20A2M=20Syst=C3=A8mes?= Date: Sat, 7 Nov 2026 16:46:29 +0100 Subject: [PATCH] feat(render): journal du rendu lance par Studio et images lentes signalees Studio host passe --render-log (run\render-.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. --- render/src/main.cpp | 20 ++++++++++++++++++++ studio/host/app/src/studio_host.cpp | 2 ++ 2 files changed, 22 insertions(+) diff --git a/render/src/main.cpp b/render/src/main.cpp index 6d179ee..fff34aa 100644 --- a/render/src/main.cpp +++ b/render/src/main.cpp @@ -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(std::chrono::duration_cast(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(&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(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(outcome).measurements.cpu_ms); ++frames_since_report; diff --git a/studio/host/app/src/studio_host.cpp b/studio/host/app/src/studio_host.cpp index c5f463e..9c2a33e 100644 --- a/studio/host/app/src/studio_host.cpp +++ b/studio/host/app/src/studio_host.cpp @@ -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);