Files
Renderive/YSGraphic_Core/architecture/Plot.h
T
2026-07-24 10:54:44 +08:00

91 lines
3.8 KiB
C++

#pragma once
#include <QTime>
#include <cstdint>
#include "Renderable.h"
namespace YSG {
void LIB_DECL start_render_scheduler();
class Render_Scheduler;
struct PlotPrivate;
class Performance_Shower;
/// Qt 图表窗口和全部 Renderable 的渲染调度入口。
class LIB_DECL Plot : public QWidget {
Q_OBJECT
public:
/// 返回性能面板是否启用。
bool use_performance_shower();
/// 启用或关闭性能面板。
void set_use_performance_shower(bool use);
/// 初始化 Plot 默认层结构。
virtual void init();
/// 同步请求一次渲染。
void render();
/// 返回背景颜色。
QColor background_color();
bool first_resize = true, first_prepare_data = true;
/// 设置背景颜色。
void set_background_color(const QColor& color) const;
/// paintEvent 消费颜色缓冲时的获取模式。
Plot_Buffer_Acquire_Mode paint_buffer_acquire_mode() const;
void set_paint_buffer_acquire_mode(Plot_Buffer_Acquire_Mode mode);
/// Renderable 侧 State/Input 缓冲默认获取模式。
Plot_Buffer_Acquire_Mode render_able_buffer_acquire_mode() const;
void set_render_able_buffer_acquire_mode(Plot_Buffer_Acquire_Mode mode);
/// Plot 级渲染调度模式。
Plot_Render_Schedule_Mode render_schedule_mode() const;
void set_render_schedule_mode(Plot_Render_Schedule_Mode mode);
/// 调度检查定时器频率。
double render_check_fps() const;
void set_render_check_fps(double fps);
/// Plot 级最大提交帧率,0 表示不限速。
double max_render_fps() const;
void set_max_render_fps(double fps);
/// 标记 Plot 状态有新版本。
void mark_render_state_dirty();
/// 按请求来源交给调度策略尝试提交。
void request_render(Render_Request_Source source = Render_Request_Source::Dirty);
/// 把 Renderable 放入指定绘制层。
void add_renderable(Renderable* able, const QString& layer_name);
/// 请求指定 Renderable 的独立像素缓存后台渲染。
void mark_independent_render_dirty(Renderable* able, Render_Request_Source source = Render_Request_Source::Dirty);
struct Layer {
QString layer_name;
QVector<Renderable*> renderable_list;
};
QString object_name;
QList<Layer*> layer_list;
QString default_layer_name;
/// 创建默认绘制层。
virtual void init_layer();
/// 判断是否有 Plot 级 CPU 渲染任务运行。
bool is_rendering();
/// 启动渲染检查定时器。
void start_render(int refreshTimesPreSecond);
/// 启动默认渲染检查定时器。
void start_render() const;
/// 暂停自动渲染检查。
void pause_render() const;
Plot();
~Plot() override;
PlotPrivate* d{};
private:
QHash<QString, Layer*> mLayerMap;
bool event(QEvent* event) final;
void paintEvent(QPaintEvent* event) final;
void schedule_render_timer();
bool submit_render_once();
void on_render_request(Render_Request_Source source);
bool submit_render_with_fps_limit();
void schedule_max_fps_submit(std::uint64_t targetNs);
bool has_submit_candidate(Render_Request_Source source, std::uint64_t nowNs);
bool render_able_ready_for_submit(Renderable* able, Render_Request_Source source, std::uint64_t nowNs, bool independent);
void mark_render_able_submitted(Renderable* able, std::uint64_t nowNs);
void finish_render();
void request_update(const QRegion& region);
void render_color(Renderable::Color_Buffer* color, QSize size, QColor background, std::uint64_t version);
void submit_independent_render(Renderable* able, Render_Request_Source source);
void render_independent_color(Renderable* able, Pixel_Buffer_Slot* pixel, QSize size, std::uint64_t version);
void finish_independent_render(Renderable* able);
friend class Render_Scheduler;
};
} // namespace YSG