我正在使用glumpy来可视化图形。Glumpy负责使用openGl将数据上传到图形处理器。我使用的是"pyqt5“后端。
我在使用glumpy时遇到了一些问题。如果我频繁绑定gpu上的缓冲区,程序开始运行非常慢。我删除了CPU端的glumpy程序(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,使其解除所有缓冲区的绑定?
发布于 2020-06-11 20:42:08
我解决了。
首先,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 -)程序,着色器不会自动分离。它是一个事件堆栈,但也有层(),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'])https://stackoverflow.com/questions/62321433
复制相似问题