【问题标题】:Reset glContext of a pyqt5 widget重置 pyqt5 小部件的 glContext
【发布时间】:2020-06-11 09:42:29
【问题描述】:

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

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

Glumpy 正在使用 QGLWidget 的 glContext。 here

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

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

有没有办法重新加载/重新实例化/刷新 glContext 以解除所有缓冲区的绑定?

【问题讨论】:

    标签: python qt opengl pyqt5 glumpy


    【解决方案1】:

    我解决了。

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

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

    我的问题是由 app.window.event 类中的 _event_stack 引起的。 您可以通过attach(event_handler)remove_handlers(handler) 方法修改_event.stack如果您删除(着色器)程序,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'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-08
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      相关资源
      最近更新 更多