仍然闪烁

This commit is contained in:
2026-08-02 19:26:50 +08:00
parent 9a39f88427
commit 36d63efc7b
10 changed files with 650 additions and 128 deletions
+40 -11
View File
@@ -6,6 +6,7 @@
#include "../architecture/Update_Completion.h"
#include "../base/global.h"
#include "../render/Canvas.h"
#include "../render/Frame_Prepare_Subflow.h"
#include "../render/Render_Frame_Snapshot.h"
#include <algorithm>
#include <memory>
@@ -21,6 +22,7 @@ struct Frame_Render_Job {
Render_Frame_Snapshot render_snapshot;
Renderable_Frame_Tree renderables;
std::shared_ptr<Frame_Worker_Stats> worker_stat;
std::atomic_uint64_t prepared_output_count{0};
};
class Plot_Core_Private final : public std::enable_shared_from_this<Plot_Core_Private>, public Frame_Flow_Host {
public:
@@ -92,17 +94,25 @@ public:
Render_Task_Kind::Frame,
Task{},
[job](Render_Task_Graph& graph, Render_Task_Graph_Node entry, Render_Task_Graph_Node exit) {
auto prepare = graph.emplace(Task([job]() {
job->owner->prepare_frame_job(job);
auto prepare_begin = graph.emplace(Render_Task_Kind::Frame, Task([job]() {
job->owner->begin_prepare_frame_job(job);
}));
auto draw = graph.emplace(Task([job]() {
auto prepare_dispatch = graph.emplace_subflow(Render_Task_Kind::Frame, [job](Render_Task_Subflow& subflow) {
job->owner->dispatch_prepare_subflow(job, subflow);
});
auto prepare_end = graph.emplace(Render_Task_Kind::Frame, Task([job]() {
job->owner->end_prepare_frame_job(job);
}));
auto draw = graph.emplace(Render_Task_Kind::Primitive, Task([job]() {
job->owner->draw_frame_job(job);
}));
auto finalize = graph.emplace(Task([job]() {
auto finalize = graph.emplace(Render_Task_Kind::Frame, Task([job]() {
job->owner->finalize_frame_job(job);
}));
graph.precede(entry, prepare);
graph.precede(prepare, draw);
graph.precede(entry, prepare_begin);
graph.precede(prepare_begin, prepare_dispatch);
graph.precede(prepare_dispatch, prepare_end);
graph.precede(prepare_end, draw);
graph.precede(draw, finalize);
graph.precede(finalize, exit);
},
@@ -112,7 +122,6 @@ public:
});
}),
job->worker_stat,
3,
true
});
if (submitted)
@@ -128,18 +137,35 @@ public:
static bool frame_job_valid(const std::shared_ptr<Frame_Render_Job>& job) {
return job && job->buffer && job->lifecycle && !job->render_snapshot.destroying();
}
void prepare_frame_job(const std::shared_ptr<Frame_Render_Job>& job) {
void begin_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();
job->prepared_output_count.store(0, std::memory_order_release);
}
void dispatch_prepare_subflow(const std::shared_ptr<Frame_Render_Job>& job, Render_Task_Subflow& subflow) {
if (!frame_job_valid(job) || !job->lifecycle->prepare_begin_ns)
return;
for (const auto& node : job->renderables) {
const auto& renderable = node.renderable;
if (!renderable || !renderable->should_prepare())
continue;
renderable->prepare_data(job->render_snapshot, node.frame_view);
++frame.prepared_output_count;
build_renderable_prepare(*renderable, subflow, job->render_snapshot, node.frame_view);
job->prepared_output_count.fetch_add(1, std::memory_order_relaxed);
}
}
void end_prepare_frame_job(const std::shared_ptr<Frame_Render_Job>& job) {
if (!frame_job_valid(job) || !job->lifecycle->prepare_begin_ns)
return;
Frame_Lifecycle_Record& frame = *job->lifecycle;
if (job->render_snapshot.frame_update_states) {
for (const auto& node : job->renderables) {
if (node.renderable)
drain_renderable_prepare_updates(*node.renderable, *job->render_snapshot.frame_update_states);
}
}
frame.prepared_output_count = job->prepared_output_count.load(std::memory_order_acquire);
frame.prepare_end_ns = steady_now_ns();
if (job->owner && job->owner->context)
job->owner->context->first_prepare_data.store(false, std::memory_order_release);
@@ -169,7 +195,10 @@ public:
void execute_frame_job(const std::shared_ptr<Frame_Render_Job>& job) {
if (!job || !job->buffer || !job->lifecycle || job->render_snapshot.destroying())
return;
prepare_frame_job(job);
begin_prepare_frame_job(job);
Render_Task_Subflow no_subflow(nullptr);
dispatch_prepare_subflow(job, no_subflow);
end_prepare_frame_job(job);
draw_frame_job(job);
finalize_frame_job(job);
}