2

我正在构建一个 Cocoa/OpenGL 应用程序,每次大约 2 秒,我需要控制每个视频帧以及写入数字 IO 设备。如果在我进行 openGL 调用之后我放开主线程(例如,如果我在间隔为 0.01 秒的计时器触发方法中进行 openGL 调用)openGLview 每次调用都会刷新glFinish()
但是,如果我改为让主线程像在 2 秒长的 while 循环中那样忙碌,openGl 调用将不起作用(令人惊讶的是,第一次调用glFinish()会起作用,但其余调用不会起作用)。文件说glFinish应该阻塞线程,直到执行 gl 命令。任何人都可以帮助我了解这里发生了什么或提供解决此问题的方法。为了清楚起见,我想一个接一个地呈现 200 帧,而不会丢失一帧,并通过写入数字 IO 端口(我对此没有问题)标记每一帧刷新,所有这些都在 Snow Leopard 上。

4

1 回答 1

4

这不是我的部门——NSOpenGLView我自己是非常普通的用户——但从Mac OpenGL 文档看来,您可能想为此使用CVDisplayLink( Q&A1385 )。即使那不会这样做,那里的其他东西也可能会有所帮助。

编辑

我只对此做了一些基本的测试,但看起来你可以做你想做的事,只要你首先设置正确的 OpenGL 上下文,然后在每帧之后交换缓冲区(假设你使用的是双缓冲上下文):

// inside an NSOpenGLView subclass, somewhere outside the usual drawing loop
- (void) drawMultipleFrames
{
    // it might be advisable to also do a [self lockFocus] here,
    // although it seems to work without that in my simple tests

    [[self openGLContext] makeCurrentContext];

    // ... set up common OpenGL state ...

    for ( i = 0; i < LOTS_OF_FRAMES; ++i )
    {
        // ... draw your frame ...

        glFinish();
        glSwapAPPLE();
    }

    // unlockFocus here if locked earlier
}

我之前尝试过[[self openGLContext] flushBuffer]在每一帧的末尾使用——它不需要glSwapAPPLE但不会像这样阻塞,glFinish所以你可能会让帧相互踩踏。这似乎适用于其他应用程序,在后台运行等,但当然是 YMMV。

于 2011-06-21T00:13:02.250 回答