Trim recording loop and retain async worker state

This commit is contained in:
2026-06-16 08:16:59 +02:00
parent 76ca2eea1a
commit 640ebc4be4
6 changed files with 87 additions and 37 deletions

View File

@@ -473,11 +473,6 @@ void App::draw(float dt)
void App::update(float dt)
{
static std::mutex mutex;
// avoid multiple threads to update the scene
//std::lock_guard<std::mutex> lock(mutex);
const auto update_plan = pp::app::plan_app_frame_update(redraw, animate);
if (!update_plan.update_frame)
return;
@@ -646,6 +641,33 @@ void App::rec_export(std::string path)
LOG("Recording export action failed: %s", status.message);
}
namespace
{
template <typename CanvasDocument>
void encode_recording_frame(
App& app,
pp::app::RecordingWorkerIterationPlan const& plan,
Canvas* legacy_canvas,
CanvasDocument* canvas_document,
CanvasEncoder* encoder)
{
if (plan.clear_dirty_stroke)
canvas_document->m_dirty_stroke = false;
PBO equirect = legacy_canvas->m_layers_merge.gen_equirect_pbo(encoder->frame_size());
std::this_thread::yield();
ImageRef img;
img.create(equirect.width, equirect.height, equirect.map());
encoder->encode(img);
equirect.unmap();
LOG("rec frame encoded");
if (plan.update_frame_label)
app.update_rec_frames();
}
}
void App::rec_loop()
{
BT_SetTerminate();
@@ -665,20 +687,7 @@ void App::rec_loop()
break;
if (plan.encode_frame && legacy_canvas && canvas_document && encoder)
{
if (plan.clear_dirty_stroke)
canvas_document->m_dirty_stroke = false;
PBO equirect = legacy_canvas->m_layers_merge.gen_equirect_pbo(
encoder->frame_size());
std::this_thread::yield();
ImageRef img;
img.create(equirect.width, equirect.height, equirect.map());
encoder->encode(img);
equirect.unmap();
LOG("rec frame encoded");
if (plan.update_frame_label)
update_rec_frames();
}
encode_recording_frame(*this, plan, legacy_canvas, canvas_document, encoder);
}
}