我正在使用Cairo gi.repository.Gtk.DrawingArea
,我需要处理两种不同的事件:
draw_summary()
)draw_dot()
理想情况下,当我需要draw_dot()
时,我只会使一个小区域(如我的绘图区域的垂直条带)无效,并且当我想draw_dummary()
时,我会使其他区域无效}。我每次都可以重绘整个区域,但这会变得很昂贵,我宁愿只更新需要它的地方。
据我所知,我唯一可用的触发机制是调用:
plot.queue_draw_area
- 但此调用依次通过以下方式与draw
事件相关联:
self.plot_area.connect("draw", self.handle_draw)
...这意味着我无法将draw_dot
与draw_summary
电话分开排队。当我调用queue_draw_area
时,我所能做的只是调用我的一个处理程序。是否有标准模式将绘图操作分解为可以独立排队的单独函数?
答案 0 :(得分:1)
嗯。你的绘图实际上如何工作?我的意思是,GTK还可以通过其他原因来调用你的回调,而不是内部重绘。所以你绘制回调必须能够处理完整的重绘。
对于优化:您可以获取cairo上下文的剪辑上下文,以确定实际需要重绘的部分。 C中的函数是cairo_clip_extents
来获取边界矩形,而`cairo_copy_clip_rectangle_list'来获取作为剪辑一部分的所有单个矩形的列表。