c - GTK+2 与 GTK+3 信号 "expose/draw/render"事件

标签 c gtk gtk3 gtk2

我最近问了一些问题herehere关于我正在研究的一个程序,它为分子、原子系统提供了一个可视化界面……正如之前这些消息中提到的,我的程序有 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/

相关文章:

c - "print to file"Gtk打印文件窗口不显示图标

c - 使用 GIOChannel 清空管道

c - 如何使用 gtk3 在 gtk_dialog 窗口中打包小部件

c - 降低 GTK+ 中的按钮高度

c - 结构和类型定义

C sscanf : why is this segfaulting?

c - 如何使用 C 在 Windows 7 上以编程方式设置 IP 地址

C: fgets() 和命令行输入

python - 我怎样才能在我的应用程序中制作小的股票图标?

c - 无法在 GTK+ 窗口中嵌入 Gstreamer 视频