【问题标题】:GTK+2 vs. GTK+3 signal "expose/draw/render" eventsGTK+2 与 GTK+3 信号“暴露/绘制/渲染”事件
【发布时间】:2016-10-03 17:28:03
【问题描述】:

我最近向herehere 提出了一些关于我正在开发的程序的问题,该程序为分子、原子系统提供了可视化界面……如这些先前的消息中所述,我确实有 3 个不同版本的我的程序:

  • (a) GTK2 + GtkGlext:效果很好!
  • (b) GTK3 + X11:工作正常!
  • (c) GTK3 + GtkGLArea : 不起作用 :-(

虽然我仍在研究 (c),但在我试图找出 (a) 和 (b) 之间一些行为差异的根源时出现了一些问题。 (b) 中的 OpenGL 渲染明显慢于 (a),或者我认为是这样。 如果您查看此link,您会看到我得到了一些帮助并设法发现 GTK+ 信号在 GTK+2 (a) 和 GTK+3 (b) 和 (c) 之间的处理方式不同,甚至 (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 ...现在我的问题将相当明显,但是我该如何更改或者我应该说正确的 GTK+3 版本从 OpenGL 渲染的角度来看,我的程序使其与 GTK+2 版本一样平滑,或者如果您更喜欢使用 GTK+3 只发射一次信号而不是 5 次?

提前致谢!

【问题讨论】:

    标签: c gtk gtk3 gtk2


    【解决方案1】:

    回答我自己的问题,希望能帮助别人避免我犯的同样的错误。

    要重新绘制我正在使用的 OpenGL 窗口:

    void update (GtkWidget * plot)
    {
      gtk_widget_hide (plot);
      gtw_widget_show (plot);
    }
    

    我应该一直在使用:

    gtk_widget_queue_draw (plot);
    

    所有问题都解决了!

    【讨论】:

    • 嗨,我正在尝试将使用 GtkGLArea 的原始 GTK1 应用程序移植到 GTK3。它已经适用于 GTK2,但在 GTK3 中我也得到了全黑输出。在移植时,我保持原始 GL 相关代码不变,只需要对 GTK3 中不可用的 gtk_gl_area_swap_buffers() 调用做一些事情。我现在尝试了gtk_widget_queue_draw(),但并没有什么不同。如果您对如何调试 OpenGL 相关问题有任何提示,那就太好了!不幸的是,到目前为止我还没有处理过 OpenGL,所以我很不知所措......
    • GtkGLarea 仅支持现代 OpenGL(着色器语言)是您的旧代码是否使用着色器,如果没有,那么您需要重新编写该部分...
    • 谢谢!不幸的是,它不是...:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多