0

我正在使用 glumpy 来可视化图表。Glumpy 负责使用 openGl 将数据上传到 GPU。我正在使用“pyqt5”后端。

我在使用 glumpy 时遇到了一些问题。如果我经常在 gpu 上绑定缓冲区,程序开始运行很慢。我删除了 glumpy 程序 cpu 端(python del),我也没有保留任何参考,gc 应该照顾它。通过进行堆分析,发现性能损失的唯一原因不是 GPU 上的取消引用内存。

Glumpy 正在使用 QGLWidget 的 glContext。这里

        if context.isValid():
            self._native_window = QtOpenGL.QGLWidget(context)
        else:
            self._native_window = QtOpenGL.QGLWidget(__glformat__)

重新加载整个小部件对我不起作用。

有没有办法重新加载/重新实例化/刷新 glContext 以便它取消绑定所有缓冲区?

4

1 回答 1

0

我解决了。

首先,GPU 上分配的内存并不是我性能问题的原因。但是,glumpy 可以通过内置GLObject.deactivate()方法“释放”GPU 内存。(我必须自己在 label-renderer agg-glyph-collection上编写 deactivate() 方法。

每个 GLObject 都有这个方法,对我来说 gloo.Program.deactivate() 方法通过将绑定缓冲区的大小设置为 0 来解决它。

我的问题是由课堂引起_event_stackapp.window.event。你可以修改_event.stackbyattach(event_handler)remove_handlers(handler)method。如果您删除(着色器)程序,则 event_handlers 不会自动分离。 它是一个事件堆栈,但也有层(dicts),该remove_handlers方法将找到附加给定处理程序之一的第一层(帧)并删除任何给定处理程序的所有出现但仅在此层/帧中。

因此,出于我的目的,解决方案是分别分离我的所有程序。

    self.program_points.deactivate()
    self.skip_plane_program.deactivate()
    self.axes_program.deactivate()
    self.labels_graph_program.deactivate()
    self.labels_axis_program.deactivate()
    # this is necessary because glumpy breaks symmetry between push and pop on event_stack
    window.remove_handlers(self.program_points['transform'])
    window.remove_handlers(self.axes_program['transform'])
    window.remove_handlers(self.labels_graph_program['transform'])
    window.remove_handlers(self.skip_plane_program['transform'])
    window.remove_handlers(self.labels_axis_program['transform'])

这不能按预期工作:

 window.remove_handlers(self.program_points['transform'], self.axes_program['transform'], self.labels_graph_program['transform'], self.labels_axis_program['transform'])
于 2020-06-11T12:42:08.007 回答