Cocoa:如果启用了VSync,则阻止NSOpenGLContext flushBuffer阻塞

时间:2011-08-08 13:51:57

标签: multithreading cocoa macos

我目前正在osx上开发一个c ++应用程序框架(我现在正在使用osx版本,将成为跨平台)并且我遇到了以下问题:基本上我的应用程序类完全是事件驱动的。我还编写了自己的Timer / Callback(不使用NSTimer,因此只与我自己的事件循环有关,而不是NSApplications)c ++中的类只是将事件添加到我的Applications事件队列中,以便从mainthread触发它们。现在,我基本上让其中一个计时器尽可能快地调用我的Windows绘图函数,它基本上就像这样(伪代码):

void myCocoaWindow::draw()
{
    enableNSOpenGLContext();
    //perform drawing

    //Swap buffers
    [[m_glView openGLContext] flushBuffer];
}

只要关闭垂直同步,一切都很好。但是一旦打开它,flushBuffer功能就会阻塞,直到下一个垂直回扫,从而阻止我的整个事件循环。 由此得出以下问题:

  1. NSApplication 事件循环如何处理?如果我仅使用本机可可代码实现相同的行为,NSApplications事件循环似乎不会受到等待垂直回溯的影响?
  2. 我可以在辅助线程中运行draw函数(从而避免在我的事件循环中阻塞)吗?这需要线程安全初始化并访问相应的 NSOpenGLContext ,尽管可能吗?
  3. 为了澄清问题二,我知道我可以自己锁定与NSOpenGLContext相关的所有函数,我的问题是,如果没有其他任何东西可以访问我没有任何控制权的上下文,那就更安全了!

0 个答案:

没有答案