Какао: Предотвратить блокировку NSOpenGLContext flushBuffer, если включен VSync - PullRequest
1 голос
/ 08 августа 2011

В настоящее время я занимаюсь разработкой среды приложения c ++ для osx (сейчас я работаю над версией 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. Могу ли я запустить функцию рисования во вторичном потоке (и, таким образом, избежать блокировки внутри моего цикла событий)? Для этого потребуется поточная безопасная инициализация и доступ к соответствующему NSOpenGLContext , но возможно ли это?

Чтобы прояснить второй вопрос, я знаю, что могу заблокировать все функции, связанные с NSOpenGLContext, мой вопрос скорее в том, насколько безопасно, что ничто иное не получит доступ к контексту, над которым я не имею никакого контроля!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...