我在gtkmm应用程序上有两个绘图信号图。
问题出在我必须绘制一个包含很多点(大约300-350k)并向以下点画线的图形时,因为它会降低每次迭代绘制所有点的速度。
bool DrawArea::on_draw(const Cairo::RefPtr<Cairo::Context>& c)
{
cairo_t* cr = c->cobj();
//xSignal.size() = ySignal.size() = 350000
for (int j = 0; j < xSignal.size() - 1; ++j)
{
cairo_move_to(cr, xSignal[j], ySignal[j]);
cairo_line_to(cr, xSignal[j + 1], ySignal[j + 1]);
}
cairo_stroke(cr);
return true;
}
我知道存在一个cairo_stroke_preserve,但我认为这对我无效,因为当我在图形之间切换时,它消失了。
我一直在研究如何保存路径并将其恢复到Cairo文档中,但是我什么都没看到。 2007年,来自开罗的一位用户在文档中建议“做”相同的事情,但显然尚未完成。
有任何建议吗?
有cairo_copy_path()
和cairo_append_path()
(也有cairo_copy_path_flat()
和cairo_path_destroy()
)。
因此,您可以使用cairo_copy_path()
保存路径,然后使用cairo_append_path()
将其追加到当前路径。
我怀疑这会加快您的绘图速度。将这些行添加到当前路径不太可能很慢。相反,我希望这些线条的实际绘制速度会很慢。
您写道:“在每次迭代中绘制所有点会很慢。”我不确定“每次迭代”指的是什么,但是为什么要一直画所有这些点呢?只绘制一次然后重新使用绘制的结果是否更有意义?