3

Python をhttps://github.com/tdz/gtkglextの gtk3 および GTKGLExt フォークと組み合わせて使用​​するので、gobject イントロスペクション機能を使用して Python から Gtk3 を使用できます。OpenGL のものを描画するために Gtk.DrawingArea を作成しました。このウィジェットのインスタンスが 1 つしかない限り、すべてが正常に機能します。

ただし、Gtk Notebook を使用して、このウィジェットの複数のインスタンスをノートブックの異なるページに表示します (ページごとに 1 つのウィジェット)。

ときどき (非決定論的な方法で) プログラムがセグメンテーション違反でクラッシュすることがあります。私はgdbを使用してスタックトレースを実行し、描画の最後に配置された「gtk_widget_end_gl」への呼び出しであると問題を特定し、ハンドラーメソッドを実現および構成しました(もちろん、それぞれの先頭にもgtk_widget_begin_glがあります) .

スタックトレースからの関連する抜粋は次のとおりです。

0  0xb1170b58 in _gdk_x11_gl_context_impl_get_current () at gdkglcontext-x11.c:514
1  0xb116c094 in gdk_gl_context_get_current () at gdkglcontext.c:244
2  0xb116c0b4 in gdk_gl_context_release_current () at gdkglcontext.c:215
3  0xb4d04592 in gtk_widget_end_gl (widget=0xa175608, do_swap=0) at gtkglwidget.c:549

以下は、「ウィジェット」が Gtk.DrawingArea のインスタンスである場合に問題が発生する、私の実現方法の最小限の例です。

def on_realize(self, widget, *user_data):
    if not GtkGLExt.widget_begin_gl(widget):
        return False
    gl.glClearColor(BACKGROUND_COLOR[0],
                    BACKGROUND_COLOR[1],
                    BACKGROUND_COLOR[2],
                    BACKGROUND_COLOR[3])
    GtkGLExt.widget_end_gl(widget, False)  

なぜこの問題が時々発生するのか(新しいウィジェットが作成されるたびに約5回)、私にはほとんどわからないので、誰かが同じことを経験したことがあるか、問題を再現できるか、解決策を見つけるのを手伝ってくれるかどうか疑問に思います.

ここで OpenGL コンテキストを手動で作成しないと言う必要があります。これは、提供されている例では、これは決して必要ではないようで、ウィジェットが独自にこれを行うと考えたからです。スタックトレースは、コンテキストの取得に問題があるようであることを示しています。私を驚かせるのは、これが時々しか起こらないという事実です。私は経験豊富な C プログラマーではないので、誰かがこの問題に対処する方法を教えてくれたら、とてもうれしいです。

4

0 に答える 0