展示优化
This commit is contained in:
@@ -183,9 +183,11 @@ static void request_performance_update(const std::shared_ptr<Performance_Worker_
|
||||
callback();
|
||||
}
|
||||
}
|
||||
void schedule_performance_metrics_worker(const std::shared_ptr<Performance_Worker_State>& state) {
|
||||
void schedule_performance_metrics_worker(const std::shared_ptr<Performance_Worker_State>& state, bool request_repaint) {
|
||||
if (!state || state->cancelled.load(std::memory_order_acquire))
|
||||
return;
|
||||
if (request_repaint)
|
||||
state->repaint_requested.store(true, std::memory_order_release);
|
||||
state->work_requested.store(true, std::memory_order_release);
|
||||
if (state->worker_active.exchange(true, std::memory_order_acq_rel))
|
||||
return;
|
||||
@@ -332,13 +334,14 @@ void Performance_Overlay::set_enabled(bool enabled) {
|
||||
d()->enabled_value.store(enabled, std::memory_order_release);
|
||||
worker->enabled.store(enabled, std::memory_order_release);
|
||||
if (!enabled) {
|
||||
worker->repaint_requested.store(false, std::memory_order_release);
|
||||
worker->published_snapshot.store({}, std::memory_order_release);
|
||||
request_performance_update(worker);
|
||||
return;
|
||||
}
|
||||
worker->reset_requested.store(true, std::memory_order_release);
|
||||
worker->snapshot_rebuild_requested.store(true, std::memory_order_release);
|
||||
schedule_performance_metrics_worker(worker);
|
||||
schedule_performance_metrics_worker(worker, true);
|
||||
}
|
||||
bool Performance_Overlay::enabled() const {
|
||||
return const_cast<Performance_Overlay*>(this)->d()->enabled_value.load(std::memory_order_acquire);
|
||||
@@ -356,7 +359,7 @@ void Performance_Overlay::set_options(Performance_Overlay_Options options) {
|
||||
}
|
||||
worker->snapshot_rebuild_requested.store(true, std::memory_order_release);
|
||||
if (enabled())
|
||||
schedule_performance_metrics_worker(worker);
|
||||
schedule_performance_metrics_worker(worker, true);
|
||||
}
|
||||
Performance_Overlay_Options Performance_Overlay::options() const {
|
||||
auto worker = const_cast<Performance_Overlay*>(this)->d()->metrics_worker;
|
||||
@@ -417,7 +420,7 @@ void Performance_Overlay::set_viewport(Size viewport, std::uint64_t version) {
|
||||
d()->metrics_worker->viewport_height.store(viewport.height, std::memory_order_release);
|
||||
d()->metrics_worker->viewport_version.store(version, std::memory_order_release);
|
||||
d()->metrics_worker->snapshot_rebuild_requested.store(true, std::memory_order_release);
|
||||
schedule_performance_metrics_worker(d()->metrics_worker);
|
||||
schedule_performance_metrics_worker(d()->metrics_worker, true);
|
||||
}
|
||||
bool Performance_Overlay::handle_wheel(PointF position, double angle_delta_y, double pixel_delta_y) {
|
||||
auto snapshot = display_snapshot();
|
||||
@@ -431,7 +434,7 @@ bool Performance_Overlay::handle_wheel(PointF position, double angle_delta_y, do
|
||||
delta = -(angle_delta_y / 120.0) * 3.0 * std::max(1.0, line_height);
|
||||
if (delta != 0.0) {
|
||||
performance_atomic_add(d()->metrics_worker->pending_wheel_delta_px, delta);
|
||||
schedule_performance_metrics_worker(d()->metrics_worker);
|
||||
schedule_performance_metrics_worker(d()->metrics_worker, true);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -451,13 +454,13 @@ bool Performance_Overlay::handle_pointer_press(PointF position) {
|
||||
d()->metrics_worker->drag_position_y.store(position.y, std::memory_order_release);
|
||||
d()->metrics_worker->drag_end_requested.store(false, std::memory_order_release);
|
||||
d()->metrics_worker->drag_active.store(true, std::memory_order_release);
|
||||
schedule_performance_metrics_worker(d()->metrics_worker);
|
||||
schedule_performance_metrics_worker(d()->metrics_worker, true);
|
||||
return true;
|
||||
}
|
||||
if (snapshot->scroll_track_rect.contains(position)) {
|
||||
int page = position.y < snapshot->scroll_thumb_rect.y ? -1 : 1;
|
||||
d()->metrics_worker->pending_page_delta.fetch_add(page, std::memory_order_acq_rel);
|
||||
schedule_performance_metrics_worker(d()->metrics_worker);
|
||||
schedule_performance_metrics_worker(d()->metrics_worker, true);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -465,7 +468,7 @@ bool Performance_Overlay::handle_pointer_press(PointF position) {
|
||||
bool Performance_Overlay::handle_pointer_move(PointF position) {
|
||||
if (d()->metrics_worker->drag_active.load(std::memory_order_acquire)) {
|
||||
d()->metrics_worker->drag_position_y.store(position.y, std::memory_order_release);
|
||||
schedule_performance_metrics_worker(d()->metrics_worker);
|
||||
schedule_performance_metrics_worker(d()->metrics_worker, true);
|
||||
return true;
|
||||
}
|
||||
auto snapshot = display_snapshot();
|
||||
@@ -493,7 +496,7 @@ bool Performance_Overlay::handle_pointer_release(PointF position) {
|
||||
return false;
|
||||
d()->metrics_worker->drag_position_y.store(position.y, std::memory_order_release);
|
||||
d()->metrics_worker->drag_end_requested.store(true, std::memory_order_release);
|
||||
schedule_performance_metrics_worker(d()->metrics_worker);
|
||||
schedule_performance_metrics_worker(d()->metrics_worker, true);
|
||||
return true;
|
||||
}
|
||||
bool Performance_Overlay::handle_pointer_leave() {
|
||||
|
||||
@@ -74,8 +74,9 @@ struct Renderable_Aggregate_Stat {
|
||||
struct Performance_Aggregate {
|
||||
Psc::Value_Statistics request_wait_ms;
|
||||
Psc::Value_Statistics producer_interval_ms;
|
||||
Psc::Value_Statistics admission_deadline_wait_ms;
|
||||
Psc::Value_Statistics render_queue_wait_ms;
|
||||
Psc::Value_Statistics admission_wait_ms;
|
||||
Psc::Value_Statistics render_slot_idle_wait_ms;
|
||||
Psc::Value_Statistics executor_queue_wait_ms;
|
||||
Psc::Value_Statistics prepare_ms;
|
||||
Psc::Value_Statistics draw_ms;
|
||||
Psc::Value_Statistics render_ms;
|
||||
@@ -130,7 +131,8 @@ struct Performance_Aggregate {
|
||||
summary.paint_end_ns = frame.paint_end_ns;
|
||||
summary.presented_frame_id = frame.presented_frame_id;
|
||||
summary.transition_32_ns = frame.transition_32_ns;
|
||||
summary.render_queue_wait_ns = frame.render_queue_wait_ns;
|
||||
summary.render_slot_idle_wait_ns = frame.render_slot_idle_wait_ns;
|
||||
summary.executor_queue_wait_ns = frame.executor_queue_wait_ns;
|
||||
summary.ready_queue_wait_ns = frame.ready_queue_wait_ns;
|
||||
summary.present_queue_wait_ns = frame.present_queue_wait_ns;
|
||||
summary.paint_return_wait_ns = frame.paint_return_wait_ns;
|
||||
@@ -161,9 +163,9 @@ struct Performance_Aggregate {
|
||||
update_duration(request_wait_ms, frame.render_request_ns, frame.render_begin_ns);
|
||||
if (frame.refresh.producer_interval_ns)
|
||||
producer_interval_ms.update(ns_to_ms(frame.refresh.producer_interval_ns));
|
||||
if (frame.refresh.admission_deadline_wait_ns)
|
||||
admission_deadline_wait_ms.update(ns_to_ms(frame.refresh.admission_deadline_wait_ns));
|
||||
update_duration(render_queue_wait_ms, frame.render_role_enter_ns, frame.render_begin_ns);
|
||||
admission_wait_ms.update(ns_to_ms(frame.refresh.admission_wait_elapsed_ns));
|
||||
render_slot_idle_wait_ms.update(ns_to_ms(frame.render_slot_idle_wait_ns));
|
||||
executor_queue_wait_ms.update(ns_to_ms(frame.executor_queue_wait_ns));
|
||||
update_duration(prepare_ms, frame.prepare_begin_ns, frame.prepare_end_ns);
|
||||
update_duration(draw_ms, frame.draw_begin_ns, frame.draw_end_ns);
|
||||
update_duration(render_ms, frame.render_begin_ns, frame.render_end_ns);
|
||||
@@ -299,7 +301,8 @@ enum class Performance_Metric_Id : std::uint16_t {
|
||||
Paint_Period,
|
||||
User_Period,
|
||||
Target_Period,
|
||||
Render_Queue_Wait,
|
||||
Render_Slot_Idle_Wait,
|
||||
Executor_Queue_Wait,
|
||||
Ready_Queue_Wait,
|
||||
Present_Queue_Wait,
|
||||
Paint_Return_Wait,
|
||||
@@ -307,18 +310,20 @@ enum class Performance_Metric_Id : std::uint16_t {
|
||||
Active_Workers,
|
||||
Queued_Frame_Jobs,
|
||||
Active_Frame_Jobs,
|
||||
Submitted_Jobs,
|
||||
Submitted_Topologies,
|
||||
Started_Topologies,
|
||||
Completed_Topologies,
|
||||
Started_Task_Nodes,
|
||||
Completed_Task_Nodes,
|
||||
Rejected_Frame_Jobs,
|
||||
Queue_Wait_Avg,
|
||||
Queue_Wait_Max,
|
||||
Task_Run_Avg,
|
||||
Task_Run_Max,
|
||||
Frame_Task_Count,
|
||||
Frame_Peak_Parallelism,
|
||||
Frame_Wait_Max,
|
||||
Frame_Run_Total,
|
||||
Topology_Queue_Wait_Avg,
|
||||
Topology_Queue_Wait_Max,
|
||||
Task_Node_Run_Avg,
|
||||
Task_Node_Run_Max,
|
||||
Frame_Business_Task_Count,
|
||||
Frame_Business_Task_Peak_Parallelism,
|
||||
Frame_Topology_Queue_Wait,
|
||||
Frame_Business_Task_Run_Total,
|
||||
Outcome,
|
||||
Cache_Hit,
|
||||
Cache_Miss,
|
||||
@@ -384,6 +389,7 @@ struct Performance_Worker_State {
|
||||
std::atomic_bool cancelled{false};
|
||||
std::atomic_bool reset_requested{false};
|
||||
std::atomic_bool snapshot_rebuild_requested{false};
|
||||
std::atomic_bool repaint_requested{false};
|
||||
std::atomic<Button_State> copy_button_state{Button_State::Normal};
|
||||
std::atomic<Button_State> close_button_state{Button_State::Normal};
|
||||
std::atomic<double> scroll_offset{0.0};
|
||||
@@ -427,7 +433,7 @@ inline void performance_atomic_add(std::atomic<double>& value, double delta) {
|
||||
double current = value.load(std::memory_order_acquire);
|
||||
while (!value.compare_exchange_weak(current, current + delta, std::memory_order_acq_rel, std::memory_order_acquire)) {}
|
||||
}
|
||||
void schedule_performance_metrics_worker(const std::shared_ptr<Performance_Worker_State>& state);
|
||||
void schedule_performance_metrics_worker(const std::shared_ptr<Performance_Worker_State>& state, bool request_repaint = false);
|
||||
|
||||
struct Performance_Metric_Cell {
|
||||
std::string label;
|
||||
@@ -532,8 +538,10 @@ struct Performance_Layout_Builder {
|
||||
return Performance_Metric_Id::User_Period;
|
||||
if (key == "target_period")
|
||||
return Performance_Metric_Id::Target_Period;
|
||||
if (key == "render_queue_wait")
|
||||
return Performance_Metric_Id::Render_Queue_Wait;
|
||||
if (key == "render_slot_idle_wait")
|
||||
return Performance_Metric_Id::Render_Slot_Idle_Wait;
|
||||
if (key == "executor_queue_wait")
|
||||
return Performance_Metric_Id::Executor_Queue_Wait;
|
||||
if (key == "ready_queue_wait")
|
||||
return Performance_Metric_Id::Ready_Queue_Wait;
|
||||
if (key == "present_queue_wait")
|
||||
@@ -549,7 +557,11 @@ struct Performance_Layout_Builder {
|
||||
if (key == "taskflow_active_frames")
|
||||
return Performance_Metric_Id::Active_Frame_Jobs;
|
||||
if (key == "taskflow_submitted")
|
||||
return Performance_Metric_Id::Submitted_Jobs;
|
||||
return Performance_Metric_Id::Submitted_Topologies;
|
||||
if (key == "taskflow_topologies_started")
|
||||
return Performance_Metric_Id::Started_Topologies;
|
||||
if (key == "taskflow_topologies_completed")
|
||||
return Performance_Metric_Id::Completed_Topologies;
|
||||
if (key == "taskflow_started")
|
||||
return Performance_Metric_Id::Started_Task_Nodes;
|
||||
if (key == "taskflow_completed")
|
||||
@@ -557,21 +569,21 @@ struct Performance_Layout_Builder {
|
||||
if (key == "taskflow_rejected")
|
||||
return Performance_Metric_Id::Rejected_Frame_Jobs;
|
||||
if (key == "taskflow_queue_wait_avg")
|
||||
return Performance_Metric_Id::Queue_Wait_Avg;
|
||||
if (key == "taskflow_queue_wait_p95")
|
||||
return Performance_Metric_Id::Queue_Wait_Max;
|
||||
return Performance_Metric_Id::Topology_Queue_Wait_Avg;
|
||||
if (key == "taskflow_queue_wait_max")
|
||||
return Performance_Metric_Id::Topology_Queue_Wait_Max;
|
||||
if (key == "taskflow_run_avg")
|
||||
return Performance_Metric_Id::Task_Run_Avg;
|
||||
if (key == "taskflow_run_p95")
|
||||
return Performance_Metric_Id::Task_Run_Max;
|
||||
return Performance_Metric_Id::Task_Node_Run_Avg;
|
||||
if (key == "taskflow_run_max")
|
||||
return Performance_Metric_Id::Task_Node_Run_Max;
|
||||
if (key == "frame_worker_tasks")
|
||||
return Performance_Metric_Id::Frame_Task_Count;
|
||||
return Performance_Metric_Id::Frame_Business_Task_Count;
|
||||
if (key == "frame_worker_peak")
|
||||
return Performance_Metric_Id::Frame_Peak_Parallelism;
|
||||
return Performance_Metric_Id::Frame_Business_Task_Peak_Parallelism;
|
||||
if (key == "frame_worker_wait_max")
|
||||
return Performance_Metric_Id::Frame_Wait_Max;
|
||||
return Performance_Metric_Id::Frame_Topology_Queue_Wait;
|
||||
if (key == "frame_worker_run_total")
|
||||
return Performance_Metric_Id::Frame_Run_Total;
|
||||
return Performance_Metric_Id::Frame_Business_Task_Run_Total;
|
||||
if (key == "frame_outcome")
|
||||
return Performance_Metric_Id::Outcome;
|
||||
if (key == "cache_hit_count")
|
||||
@@ -955,19 +967,22 @@ struct Performance_Layout_Builder {
|
||||
lines.push_back("[low_latency] consumer_samples accepted:" + count_text("consumer_accepted", refresh.consumer_sample_accepted_count) + " rejected:" + count_text("consumer_rejected", refresh.consumer_sample_total_count - refresh.consumer_sample_accepted_count) + " ratio:" + number_text("consumer_ratio", refresh.consumer_sample_accepted_ratio * 100.0) + "% last:" + consumer_sample_result_text(refresh.last_consumer_sample_result));
|
||||
lines.push_back("[low_latency] timing producer_interval:" + period_text("producer_interval", refresh.producer_interval_ns) + " render_service:" + period_text("render_period", refresh.render_period_ns) + " request_to_post:" + period_text("request_to_update_post", refresh.request_to_update_post_srtt_ns) + " post_to_paint:" + period_text("update_to_paint", refresh.update_post_to_paint_srtt_ns) + " paint_service:" + period_text("paint_period", refresh.paint_service_ns) + " raw_display:" + period_text("raw_display", refresh.raw_display_interval_srtt_ns) + " accepted_consumer:" + period_text("accepted_consumer", refresh.accepted_consumer_interval_srtt_ns));
|
||||
lines.push_back("[low_latency] consumer_window size:" + count_text("consumer_window_size", refresh.consumer_window_size) + " accepted:" + count_text("consumer_window_accepted", refresh.consumer_window_accepted) + " rejected:" + count_text("consumer_window_rejected", refresh.consumer_window_size - refresh.consumer_window_accepted) + " ratio:" + number_text("consumer_window_ratio", refresh.consumer_window_accepted_ratio * 100.0) + "%");
|
||||
lines.push_back("[low_latency] queue admission_deadline_wait:" + ns_text("admission_deadline_wait", refresh.admission_deadline_wait_ns) + "ms executor_queue_wait:" + ns_text("executor_queue_wait", frame.render_queue_wait_ns) + "ms present_wait:" + ns_text("present_wait", frame.present_queue_wait_ns) + "ms paint_return:" + ns_text("paint_return_wait", frame.paint_return_wait_ns) + "ms");
|
||||
lines.push_back("[low_latency] update posted:" + count_text("update_posted_count", refresh.update_posted_count) + " coalesced:" + count_text("update_coalesced_count", refresh.update_coalesced_count) + " ack:" + count_text("update_ack_count", refresh.update_ack_count) + " repost:" + count_text("update_repost_count", refresh.update_repost_count) + " paint_without_posted:" + count_text("paint_without_posted", refresh.paint_without_posted_update_count));
|
||||
lines.push_back("[low_latency] pacing admission_wait:" + ns_text("admission_wait", refresh.admission_wait_elapsed_ns) + "ms render_slot_idle:" + ns_text("render_slot_idle_wait", frame.render_slot_idle_wait_ns) + "ms");
|
||||
lines.push_back("[pipeline] queue executor_wait:" + ns_text("executor_queue_wait", frame.executor_queue_wait_ns) + "ms present_wait:" + ns_text("present_wait", frame.present_queue_wait_ns) + "ms paint_return:" + ns_text("paint_return_wait", frame.paint_return_wait_ns) + "ms");
|
||||
lines.push_back("[low_latency] update posted:" + count_text("update_posted_count", refresh.update_posted_count) + " duplicate_suppressed:" + count_text("duplicate_present_request_suppressed_count", refresh.duplicate_present_request_suppressed_count) + " ack:" + count_text("update_ack_count", refresh.update_ack_count) + " repost:" + count_text("update_repost_count", refresh.update_repost_count) + " paint_without_posted:" + count_text("paint_without_posted", refresh.paint_without_posted_update_count));
|
||||
lines.push_back("[logger] dropped:" + count_text("logger_dropped", performance_log_service().dropped_record_count()));
|
||||
lines.push_back("[low_latency] buffers rendered:" + count_text("presented_feedback", refresh.presented_frame_count) + " middle_published:" + count_text("middle_published", refresh.middle_published_count) + " middle_superseded:" + count_text("middle_superseded", refresh.middle_superseded_count) + " painting_advanced:" + count_text("painting_advanced", refresh.painting_advanced_count) + " painting_repeated:" + count_text("repeated_feedback", refresh.repeated_frame_count) + " underrun:" + count_text("underrun_feedback", refresh.underrun_count));
|
||||
lines.push_back("[low_latency] decision:" + feedback_decision_text(refresh.last_decision) + " reason:" + refresh.decision_reason + " at:" + count_text("decision_time", refresh.decision_timestamp_ns) + " producer_starvation:" + count_text("producer_starvation", refresh.producer_starvation_count) + " starvation_active:" + (refresh.producer_starvation_active ? std::string("1") : std::string("0")) + " enter:" + count_text("mode_enter", refresh.mode_enter_count) + " exit:" + count_text("mode_exit", refresh.mode_exit_count) + " efficiency:" + number_text("display_efficiency", refresh.display_efficiency * 100.0) + "%");
|
||||
lines.push_back("[executor] taskflow workers:" + count_text("taskflow_workers", static_cast<std::uint64_t>(executor.worker_count)) + " active:" + count_text("taskflow_active", static_cast<std::uint64_t>(executor.active_workers)) + " queued_frames:" + count_text("taskflow_queued_frames", static_cast<std::uint64_t>(executor.queued_frame_jobs)) + " active_frames:" + count_text("taskflow_active_frames", static_cast<std::uint64_t>(executor.active_frame_jobs)));
|
||||
lines.push_back("[executor] taskflow tasks submitted:" + count_text("taskflow_submitted", executor.submitted_jobs) + " started:" + count_text("taskflow_started", executor.started_task_nodes) + " completed:" + count_text("taskflow_completed", executor.completed_task_nodes) + " rejected_frames:" + count_text("taskflow_rejected", executor.rejected_frame_jobs));
|
||||
lines.push_back("[executor] taskflow wait avg:" + ns_text("taskflow_queue_wait_avg", executor.average_queue_wait_ns) + "ms p95:" + ns_text("taskflow_queue_wait_p95", executor.max_queue_wait_ns) + "ms run avg:" + ns_text("taskflow_run_avg", executor.average_task_duration_ns) + "ms p95:" + ns_text("taskflow_run_p95", executor.max_task_duration_ns) + "ms");
|
||||
lines.push_back("frame worker tasks:" + count_text("frame_worker_tasks", worker.task_count) + " peak_parallel:" + count_text("frame_worker_peak", worker.peak_parallelism) + " wait_max:" + ns_text("frame_worker_wait_max", worker.queue_wait_max_ns) + "ms run_total:" + ns_text("frame_worker_run_total", worker.worker_run_total_ns) + "ms");
|
||||
lines.push_back(duration_line("request_wait", "lifecycle request_wait", aggregate.request_wait_ms));
|
||||
lines.push_back("[executor/global] workers:" + count_text("taskflow_workers", static_cast<std::uint64_t>(executor.worker_count)) + " active_workers:" + count_text("taskflow_active", static_cast<std::uint64_t>(executor.active_workers)) + " queued_frame_jobs:" + count_text("taskflow_queued_frames", static_cast<std::uint64_t>(executor.queued_frame_jobs)) + " active_frame_jobs:" + count_text("taskflow_active_frames", static_cast<std::uint64_t>(executor.active_frame_jobs)));
|
||||
lines.push_back("[executor/global] topologies submitted:" + count_text("taskflow_submitted", executor.submitted_topologies) + " started:" + count_text("taskflow_topologies_started", executor.started_topologies) + " completed:" + count_text("taskflow_topologies_completed", executor.completed_topologies) + " rejected_frame_jobs:" + count_text("taskflow_rejected", executor.rejected_frame_jobs));
|
||||
lines.push_back("[executor/global] task_nodes started:" + count_text("taskflow_started", executor.started_task_nodes) + " completed:" + count_text("taskflow_completed", executor.completed_task_nodes));
|
||||
lines.push_back("[executor/global] topology_queue_wait avg:" + ns_text("taskflow_queue_wait_avg", executor.average_topology_queue_wait_ns) + "ms max:" + ns_text("taskflow_queue_wait_max", executor.max_topology_queue_wait_ns) + "ms task_node_run avg:" + ns_text("taskflow_run_avg", executor.average_task_node_duration_ns) + "ms max:" + ns_text("taskflow_run_max", executor.max_task_node_duration_ns) + "ms");
|
||||
lines.push_back("[executor/frame] business_tasks:" + count_text("frame_worker_tasks", worker.business_task_count) + " peak_parallel:" + count_text("frame_worker_peak", worker.business_task_peak_parallelism) + " topology_queue_wait:" + ns_text("frame_worker_wait_max", worker.topology_queue_wait_max_ns) + "ms business_run_total:" + ns_text("frame_worker_run_total", worker.business_task_run_total_ns) + "ms");
|
||||
lines.push_back(duration_line("request_wait", "lifecycle render_request_to_start", aggregate.request_wait_ms));
|
||||
lines.push_back(duration_line("producer_interval", "timing producer_interval", aggregate.producer_interval_ms));
|
||||
lines.push_back(duration_line("admission_deadline_wait", "timing admission_deadline_wait", aggregate.admission_deadline_wait_ms));
|
||||
lines.push_back(duration_line("render_queue_wait", "timing executor_queue_wait", aggregate.render_queue_wait_ms));
|
||||
lines.push_back(duration_line("admission_wait", "timing admission_wait", aggregate.admission_wait_ms));
|
||||
lines.push_back(duration_line("render_slot_idle_wait", "timing render_slot_idle_wait", aggregate.render_slot_idle_wait_ms));
|
||||
lines.push_back(duration_line("executor_queue_wait", "timing executor_queue_wait", aggregate.executor_queue_wait_ms));
|
||||
lines.push_back(duration_line("prepare", "lifecycle prepare", aggregate.prepare_ms));
|
||||
lines.push_back(duration_line("draw", "lifecycle draw", aggregate.draw_ms));
|
||||
lines.push_back(duration_line("render", "lifecycle render_total", aggregate.render_ms));
|
||||
@@ -1288,7 +1303,7 @@ struct Performance_Overlay_Private {
|
||||
metrics_worker->close_button_state.store(close_button_interaction.state(), std::memory_order_release);
|
||||
metrics_worker->snapshot_rebuild_requested.store(true, std::memory_order_release);
|
||||
if (enabled_value.load(std::memory_order_acquire))
|
||||
schedule_performance_metrics_worker(metrics_worker);
|
||||
schedule_performance_metrics_worker(metrics_worker, true);
|
||||
}
|
||||
|
||||
void reset_button_states() {
|
||||
@@ -1359,7 +1374,8 @@ struct Performance_Overlay_Private {
|
||||
}
|
||||
if (changed && state->enabled.load(std::memory_order_acquire)) {
|
||||
state->published_snapshot.store(build_display_snapshot(*state), std::memory_order_release);
|
||||
invoke_update_callback(*state);
|
||||
if (state->repaint_requested.exchange(false, std::memory_order_acq_rel))
|
||||
invoke_update_callback(*state);
|
||||
}
|
||||
if (state->work_requested.load(std::memory_order_acquire))
|
||||
continue;
|
||||
|
||||
Reference in New Issue
Block a user