13 个版本
0.3.12 | 2023年1月8日 |
---|---|
0.3.11 | 2021年2月20日 |
0.3.10 | 2020年11月17日 |
0.0.0 |
|
#42 in 可视化
每月 24 次下载
95KB
2K SLoC
plotters-conrod
这是一个 Plotters 的 Conrod 后端实现。在 Conrod 中绘图时,比使用默认的 Bitmap 后端更高效,因为观察到 Conrod 在高帧率下重新渲染图像非常低效(例如,用于实时绘图)。
这个后端已针对速度进行了优化,并且渲染的图表与默认的 Bitmap 后端非常相似,如果不是不可区分的。注意,尽管如此,Bitmap 后端中支持的一些特定绘图功能可能没有实现。
🇫🇷 在法国南特制作。
谁在使用它?
![]() |
MakAir |
- 👋 如果你使用
plotters-conrod
并希望被列在这里,请联系我。 - ℹ️ 开源医疗呼吸机 MakAir 使用基于 Rust 的 MakAir 控制界面 的
plotters-conrod
。
什么是 Plotters?
Plotters 是一个可扩展的 Rust 绘图库,可以用于在漂亮的图表上绘制数据,通过绘图后端(例如,到 Bitmap 图像原始缓冲区,到您的 GUI 后端,到 SVG 文件等)进行渲染。
有关 Plotters 的更多详细信息,请参阅以下链接
- 关于 Plotters 的介绍,请参阅: Crates.io 上的 Plotters;
- 在 GitHub 上查看主要仓库;
- 您还可以访问 Plotters 的 主页;
如何安装?
在您的 Cargo.toml
依赖项中包含 plotters-conrod
[dependencies]
plotters-conrod = "0.3"
使用的 plotters-conrod
版本应与您的 plotters
版本相匹配。如果还没有这样的 plotters-conrod
版本,通常使用比您的 plotters
更旧的 plotters-conrod
版本应该可以工作。
如何使用?
首先,导入 ConrodBackend
和 ConrodBackendReusableGraph
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的工作量最小。
这意味着,一些复杂的绘图类型可能无法很好地渲染。尽管如此,请放心,常见的绘图类型已经过测试,以实现预期的渲染,例如LineSeries
或Histogram
。
计划在未来实现基于像素的渲染方法。如果您已经有了实现,请随意为此库提交PR!
限制#2:文本渲染有限
仅支持单个字体家族(即serif
、sans-serif
等)和单个字体样式(即regular
、bold
等)进行文本渲染。原因是Conrod加载字体并将其传递的过程相当繁琐,因此我们最好将后端API限制为单个字体以简化问题。此外,由于底层Conrod渲染器不支持文本旋转,因此不支持字体转换。
依赖关系
~6MB
~110K SLoC