2

libdispatchでGLUTを使用する方法への回答をフォローアップしますか? 、代わりに GLFW を使用しています —</p>

次のコードは、ウィンドウをセットアップし、タイマーをセットアップしてイベントをポーリングし、時間の経過とともにレンダリングの更新をキューに入れます。

#include <dispatch/dispatch.h>
#include <GL/glfw.h>

float t=0;

int main(void)
{
    dispatch_async(dispatch_get_main_queue(), ^{
        glfwInit();
        glfwDisable(GLFW_AUTO_POLL_EVENTS);
        glfwOpenWindow(320,200,8,8,8,8,8,0,GLFW_WINDOW);
    });

    // Periodically process window events --- this isn't working.
    dispatch_source_t windowEventTimer;
    windowEventTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
    uint64_t nanoseconds = 100 * NSEC_PER_MSEC;
    dispatch_source_set_timer(windowEventTimer, dispatch_time(DISPATCH_TIME_NOW, nanoseconds), nanoseconds, 0);
    dispatch_source_set_event_handler(windowEventTimer, ^{
        glfwPollEvents();
    });
    dispatch_resume(windowEventTimer);

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        for(int i=0;i<200;++i)
        {
            // Enqueue a rendering update.
            dispatch_async(dispatch_get_main_queue(), ^{
                glClearColor (0.2f, 0.2f, 0.4f, 1.0f);
                glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

                glColor3f (1.0, 0.7, 0.7); 
                glBegin( GL_LINES );
                    glVertex3f(0,0,0);
                    glVertex3f(t+=0.02,.1,0);
                glEnd();

                glfwSwapBuffers();
            });
            // Wait a bit, to simulate complex calculations.
            sleep(1);
        }
    });

    dispatch_main();
}

アニメーションは期待どおりに更新されますが、ウィンドウ フレームは描画されず、ウィンドウはイベントに応答しません。

4

1 に答える 1

3

GLFW のソースを調べてみると、問題が見つかったと思います。GLFW によって作成された Cocoa ウィンドウの実行ループはスレッド 0 から実行する必要がありますが、GLFW はそれがスレッド 0 で実行されることを保証しませ_glfwPlatformPollEvents()0 以外のスレッド上の Cocoa GUI。)

回避策は、CoreFoundation が .xml 内からメインの libdispatch キューを処理するために使用するものと同じプライベート インターフェイスを使用することCFRunLoopです。

dispatch_main()上記のコードの呼び出しを次のように置き換えると:

while(1)
{
    _dispatch_main_queue_callback_4CF(NULL);
    usleep(10000);
}

...期待どおりに動作します — ウィンドウ フレームが描画され、ウィンドウがイベントを処理します。


このハッキーな状況を改善しようとして、私は:

于 2012-09-24T22:54:33.860 に答える