完美一版

This commit is contained in:
2026-08-02 00:26:59 +08:00
parent 85aecd0a06
commit 883df14d5e
5 changed files with 378 additions and 835 deletions
+44 -7
View File
@@ -113,15 +113,29 @@ public:
plot_execution_id,
frame.frame_id,
Render_Task_Kind::Frame,
[job]() {
job->owner->execute_frame_job(job);
Task{},
[job](tf::Taskflow& taskflow, tf::Task entry, tf::Task exit) {
auto prepare = taskflow.emplace([job]() {
job->owner->prepare_frame_job(job);
});
auto draw = taskflow.emplace([job]() {
job->owner->draw_frame_job(job);
});
auto finalize = taskflow.emplace([job]() {
job->owner->finalize_frame_job(job);
});
entry.precede(prepare);
prepare.precede(draw);
draw.precede(finalize);
finalize.precede(exit);
},
[job]() {
Task([job]() {
Global::instance()->render_scheduler().post([job]() {
job->owner->complete_frame_job(job);
});
},
}),
job->worker_stat,
3,
true
});
if (submitted)
@@ -137,8 +151,12 @@ public:
return false;
}
void execute_frame_job(const std::shared_ptr<Frame_Render_Job>& job) {
if (!job || !job->buffer || !job->lifecycle || !job->render_snapshot.context || job->render_snapshot.destroying())
static bool frame_job_valid(const std::shared_ptr<Frame_Render_Job>& job) {
return job && job->buffer && job->lifecycle && job->render_snapshot.context && !job->render_snapshot.destroying();
}
void prepare_frame_job(const std::shared_ptr<Frame_Render_Job>& job) {
if (!frame_job_valid(job))
return;
Frame_Lifecycle_Record& frame = *job->lifecycle;
frame.prepare_begin_ns = steady_now_ns();
@@ -150,8 +168,13 @@ public:
++frame.prepared_output_count;
}
frame.prepare_end_ns = steady_now_ns();
context->first_prepare_data.store(false, std::memory_order_release);
job->render_snapshot.context->first_prepare_data.store(false, std::memory_order_release);
}
void draw_frame_job(const std::shared_ptr<Frame_Render_Job>& job) {
if (!frame_job_valid(job) || !job->lifecycle->prepare_end_ns)
return;
Frame_Lifecycle_Record& frame = *job->lifecycle;
job->buffer->image.resize(job->render_snapshot.size.width, job->render_snapshot.size.height);
job->buffer->image.fill(job->render_snapshot.background_color);
Canvas canvas(job->buffer->image);
@@ -161,6 +184,12 @@ public:
job->renderables.front().renderable->render_tree_snapshot(canvas, job->render_snapshot, job->renderables, 0);
frame.draw_end_ns = steady_now_ns();
frame.render_end_ns = steady_now_ns();
}
void finalize_frame_job(const std::shared_ptr<Frame_Render_Job>& job) {
if (!frame_job_valid(job) || !job->lifecycle->render_end_ns)
return;
Frame_Lifecycle_Record& frame = *job->lifecycle;
job->buffer->version.store(frame.frame_id, std::memory_order_release);
for (const auto& update_state : job->buffer->presented_update_states) {
if (update_state)
@@ -168,6 +197,14 @@ public:
}
}
void execute_frame_job(const std::shared_ptr<Frame_Render_Job>& job) {
if (!job || !job->buffer || !job->lifecycle || !job->render_snapshot.context || job->render_snapshot.destroying())
return;
prepare_frame_job(job);
draw_frame_job(job);
finalize_frame_job(job);
}
void complete_frame_job(const std::shared_ptr<Frame_Render_Job>& job) {
if (!job || !job->buffer || !job->lifecycle)
return;