2016-10-03 63 views
2

我最近問了一些問題herehere有關我正在開發的一個程序,並提供了分子,原子系統的可視化界面......在前面的這些消息中提到我確實有3個不同版本的程序:GTK + 2與GTK + 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)即使我在這種情況下只有黑屏(但這是另一個問題),這裏是我如何準備(d)GtkWidget(s)和相應的信號,請注意,我僅在下文中介紹GTK +相關d命令:

  • 的(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); 
    

在(a)情況下,我使用Apitrace工具注意到每個OpenGL框架都被繪製了一次,而在(b)和(c)情況下繪製了5次。然後,只需在回調中添加一個基本計數器,我確認對於每個「曝光/繪製/渲染」信號被髮射(並且因此「繪圖區域」被渲染多次,對於相同的幀):

  • (A):一旦
  • (b):5次
  • (C):5次

(a)是GTK + 2,(b)和(c)是GTK + 3 ...現在我的問題會變得相當明顯,但是我怎麼能改變,或者我應該說我的程序正確GTK + 3版本,以使其在OpenGL渲染的角度上更加平滑,就像GT K + 2版本,或者如果您希望僅使用GTK + 3而不是5次發射信號?

在此先感謝!

回答

0

回答我自己的問題,希望能幫助別人避免我犯的同樣的錯誤。

重畫我的OpenGL窗口我用:

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

相反,我應該一直在使用:

gtk_widget_queue_draw (plot); 

解決了所有的問題!