繁体   English   中英

重置 pyqt5 小部件的 glContext

[英]Reset glContext of a pyqt5 widget

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

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

Glumpy 正在使用 QGLWidget 的 glContext。 这里

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

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

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

我解决了。

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

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

我的问题是由_event_stack中的app.window.event引起的。 您可以通过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'])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM