В настоящее время я занимаюсь разработкой среды приложения c ++ для osx (сейчас я работаю над версией osx, стану кроссплатформенной) и столкнулся со следующей проблемой: в основном мой класс приложений полностью управляется событиями. Я также написал свой собственный класс Timer / Callback (хотя и не использующий NSTimer и, следовательно, связанный только с моим собственным циклом событий, а не NSApplications), в c ++, который просто добавляет события в мою очередь событий Applications, чтобы они запускались из mainthread. Теперь я позволяю одному из этих таймеров срабатывать как можно быстрее, чтобы вызвать мою функцию рисования Windows, которая в основном выглядит следующим образом (псевдокод):
void myCocoaWindow::draw()
{
enableNSOpenGLContext();
//perform drawing
//Swap buffers
[[m_glView openGLContext] flushBuffer];
}
Все работает очень хорошо, пока вертикальная синхронизация выключена. Но как только я включаю его, функция flushBuffer
блокируется до следующей вертикальной трассировки и, таким образом, блокирует весь цикл обработки событий.
Из этого вытекают следующие вопросы:
- Как это обрабатывает цикл событий NSApplication ? если я реализую то же поведение, используя только собственный код какао, цикл событий NSApplications, похоже, не будет зависеть от ожидания вертикального отката ?
- Могу ли я запустить функцию рисования во вторичном потоке (и, таким образом, избежать блокировки внутри моего цикла событий)? Для этого потребуется поточная безопасная инициализация и доступ к соответствующему NSOpenGLContext , но возможно ли это?
Чтобы прояснить второй вопрос, я знаю, что могу заблокировать все функции, связанные с NSOpenGLContext, мой вопрос скорее в том, насколько безопасно, что ничто иное не получит доступ к контексту, над которым я не имею никакого контроля!