我最近问了一些问题here和 here关于我正在研究的一个程序,它为分子、原子系统提供了一个可视化界面……正如之前这些消息中提到的,我的程序有 3 个不同的版本:
- (a) GTK2 + GtkGlext:效果很好!
- (b) GTK3 + X11:工作正常!
- (c) GTK3 + GtkGLArea :不起作用 :-(
虽然我仍在研究 (c),但在我试图找出 (a) 和 (b) 之间某些行为差异的根源时出现了一些问题。 OpenGL 渲染在 (b) 中比在 (a) 中慢得多,或者我认为是这种情况。 如果你检查这个link你会看到我得到了一些帮助并设法发现 GTK+ 信号在 GTK+2 (a) 和 GTK+3 (b) 和 (c) 之间的处理方式不同,即使我只有黑屏在那种情况下(但这是另一个问题),这里是我如何准备(d)GtkWidget(s)和相应的信号,请注意,我仅在下文中提供与 GTK+ 相关的命令:
(a)
GtkWidget * drawing_area = gtk_drawing_area_new (); g_signal_connect (G_OBJECT (drawing_area), "expose-event", G_CALLBACK (on_expose), data);
(b)
GtkWidget * drawing_area = gtk_drawing_area_new (); g_signal_connect (G_OBJECT (drawing_area), "draw", G_CALLBACK(on_expose), data);
(c)
GtkWidget * drawing_area = gtk_gl_area_new (); g_signal_connect (G_OBJECT (drawing_area), "render", G_CALLBACK(on_expose), data);
使用 Apitrace 工具我注意到在情况 (a) 中每个 OpenGL 帧都被绘制了一次,而在情况 (b) 和 (c) 中它被绘制了 5 次。然后在回调中添加一个基本计数器,我确认对于每个“公开/绘制/渲染”信号都被发出(因此“绘图区域”被渲染了很多次,对于同一帧):
- (a) : 一次
- (b) : 5 次
- (c) : 5 次
(a) 是 GTK+2,(b) 和 (c) 是 GTK+3 ... 现在我的问题很明显了,但是我该如何更改或者我应该说更正我的程序可以使它在 OpenGL 渲染的角度上与 GTK+2 版本一样流畅,或者如果您更喜欢使用 GTK+3 只发射一次信号而不是 5 次?
提前致谢!
最佳答案
回答我自己的问题,希望能帮助别人避免我犯的同样错误。
要重新绘制我使用的 OpenGL 窗口:
void update (GtkWidget * plot)
{
gtk_widget_hide (plot);
gtw_widget_show (plot);
}
相反,我应该使用:
gtk_widget_queue_draw (plot);
所有问题都解决了!
关于c - GTK+2 与 GTK+3 信号 "expose/draw/render"事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39837159/