在循环中刷新NSOpenGLView,而不释放Cocoa中的主运行循环



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

这不是我的部门——我自己也很普通的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。

相关内容

  • 没有找到相关文章

最新更新