我正在构建一个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。