13 个版本

0.3.12 2023年1月8日
0.3.11 2021年2月20日
0.3.10 2020年11月17日
0.0.0 2020年11月10日

#42 in 可视化

每月 24 次下载

MIT 许可协议

95KB
2K SLoC

C++ 1K SLoC // 0.2% comments Rust 708 SLoC // 0.2% comments

plotters-conrod

Test and Build Build and Release Buy Me A Coffee

这是一个 Plotters 的 Conrod 后端实现。在 Conrod 中绘图时,比使用默认的 Bitmap 后端更高效,因为观察到 Conrod 在高帧率下重新渲染图像非常低效(例如,用于实时绘图)。

这个后端已针对速度进行了优化,并且渲染的图表与默认的 Bitmap 后端非常相似,如果不是不可区分的。注意,尽管如此,Bitmap 后端中支持的一些特定绘图功能可能没有实现。

🇫🇷 在法国南特制作。

谁在使用它?

MakAir
  • 👋 如果你使用 plotters-conrod 并希望被列在这里,请联系我
  • ℹ️ 开源医疗呼吸机 MakAir 使用基于 Rust 的 MakAir 控制界面plotters-conrod

什么是 Plotters?

Plotters 是一个可扩展的 Rust 绘图库,可以用于在漂亮的图表上绘制数据,通过绘图后端(例如,到 Bitmap 图像原始缓冲区,到您的 GUI 后端,到 SVG 文件等)进行渲染。

有关 Plotters 的更多详细信息,请参阅以下链接

如何安装?

在您的 Cargo.toml 依赖项中包含 plotters-conrod

[dependencies]
plotters-conrod = "0.3"

使用的 plotters-conrod 版本应与您的 plotters 版本相匹配。如果还没有这样的 plotters-conrod 版本,通常使用比您的 plotters 更旧的 plotters-conrod 版本应该可以工作。

如何使用?

首先,导入 ConrodBackendConrodBackendReusableGraph

use plotters_conrod::{ConrodBackend, ConrodBackendReusableGraph};

然后,构建可重复使用的图表实例(在绘图循环之外)

let mut conrod_graph = ConrodBackendReusableGraph::build();

⚠️ 这应该放在循环之外并且只调用一次;如果没有这样做,由于图表在每个帧上都会重建,会导致严重的 CPU 使用。

最后,对于您要绘制的每个帧(即主循环),调用

// Where:
//  - 'ui' is the UiCell that was derived from Ui for this frame;
//  - '(plot_width, plot_height)' is the size of your plot in pixels (make sure it matches its parent canvas size);
//  - 'ids.parent' is the widget::Id of the canvas that contains your plot (of the same size than the plot itself);
//  - 'fonts.regular' is the font::Id of the font to use to draw text (ie. a Conrod font identifier);
//  - 'conrod_graph' is a mutable reference to the graph instance you built outside of the drawing loop (pass it as a mutable reference);
let drawing = ConrodBackend::new(
    ui,
    (plot_width, plot_height),
    ids.parent,
    fonts.regular,
    &mut conrod_graph,
).into_drawing_area();

//-
// Build your chart as usual here, using the regular Plotters syntax
//-

如果您正在寻找实现的完整示例,请查看 cpu-monitor.rs

如何运行示例?

示例 #1: cpu-monitor

本例每秒采样您的CPU负载,并以实时图表的形式展示

cargo run --release --example cpu-monitor

第一个图表使用plotters-conrod,而第二个图表使用默认的位图后端作为参考。这可以用来比较两个后端的输出和性能。可以通过将REFERENCE_BITMAP_ENABLED设置为false来禁用位图参考图表。

与其他后端相比,它的轻量级如何?

plotters-conrod后端旨在在GPU上执行所有昂贵的计算工作,而不是在CPU上。这对于大型的绘图区域(以像素为单位)来说效率更高。

而默认的位图后端光栅化器只会使用CPU(在实时图表上FPS较高时相当重),这个Conrod后端将大部分工作发送到GPU,因为它使用OpenGL原语来绘制形状。

在2019款MacBook Pro笔记本电脑上,运行了这个示例,比较了位图后端与Conrod后端,该笔记本电脑配备2.3GHz 8核Intel Core i9 CPU和Radeon Pro 560X 4GB GPU。示例以--release模式编译,并启用了所有CPU优化。

以下是30 FPS下800x480像素图表的测量结果

  • ➡️ 位图后端:CPU ~31% 稳定,GPU ~10% 平均(CPU绘制,GPU在其帧缓冲区上渲染位图);
  • ➡️ Conrod后端:CPU ~4% 稳定,GPU ~15% 平均(CPU传递数据,GPU绘制);

两种后端的内存使用量大致相同。

有什么限制吗?

限制#1:无像素级渲染

由于Conrod在渲染图像小部件时效率较低(可能是它绕过了GPU并执行了大量的CPU处理工作),因此选择忽略像素原语的渲染。

在那种情况下已禁用默认的Plotters光栅化器,以避免在没有库用户注意到的情况下降低渲染性能。这保证了GPU用于渲染,而CPU的工作量最小。

这意味着,一些复杂的绘图类型可能无法很好地渲染。尽管如此,请放心,常见的绘图类型已经过测试,以实现预期的渲染,例如LineSeriesHistogram

计划在未来实现基于像素的渲染方法。如果您已经有了实现,请随意为此库提交PR!

限制#2:文本渲染有限

仅支持单个字体家族(即serifsans-serif等)和单个字体样式(即regularbold等)进行文本渲染。原因是Conrod加载字体并将其传递的过程相当繁琐,因此我们最好将后端API限制为单个字体以简化问题。此外,由于底层Conrod渲染器不支持文本旋转,因此不支持字体转换。

依赖关系

~6MB
~110K SLoC