GTK + 2与GTK + 3信号“曝光/绘制/渲染”事件

时间:2016-10-03 17:28:03

标签: c gtk gtk3 gtk2

我最近问了一些问题herehere关于我正在研究的程序,它为分子,原子系统提供了一个可视化界面......正如我之前的这些消息所提到的那样我有3个我程序的不同版本:

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

虽然我仍在研究(c),但在我试图找出(a)和(b)之间某些行为差异的起源时,出现了一些问题。 (b)中的OpenGL渲染明显慢于(a)中的渲染,或者我认为是这种情况。 如果你检查这个link,你会看到我得到了一些帮助,并设法发现GTK + 2信号在GTK + 2(a)和GTK + 3(b)之间没有以相同的方式处理,并且(c )即使我在这种情况下只有一个黑屏(但这是另一个问题),这里是我准备(d)GtkWidget和相应的信号,请注意我此后只提供GTK +相关命令:< / p>

  • (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次只发出一次信号?

提前致谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

相反,我应该一直在使用:

gtk_widget_queue_draw (plot);

所有问题都解决了!