Рисовать из отдельной темы с NSOpenGLLayer
Я работаю над приложением, которое должно рисовать с помощью OpengGL с частотой обновления, по крайней мере равной частоте обновления монитора. И мне нужно выполнить рисунок в отдельном потоке, чтобы рисунок никогда не блокировался интенсивными действиями пользовательского интерфейса.
На самом деле я используюNSOpenGLView
в комбинации сCVDisplayLink
и я могу достичь 60-80FPS без каких-либо проблем.
Так как мне нужно также отобразить некоторые элементы управления какао поверх этого представления, я попытался создать подклассNSOpenGLView
и сделать его слоистым, следуяLayerBackedOpenGLView Apple, пример.
Результат неудовлетворительный, и я получаю много артефактов.
Поэтому я решил проблему с помощью отдельногоNSWindow
разместить элементы управления какао и добавив это окно в качестве дочернего окна главного окна, содержащегоNSOpenGLView
, Он работает нормально, и я могу получить тот же FPS, что и первоначальная реализация.
Поскольку я считаю это решение довольно грязным, я ищу альтернативный и более чистый способ достижения того, что мне нужно.
Несколько дней назад я наткнулсяNSOpenGLLayer
и я подумал, что это может быть использовано в качестве жизнеспособного решения моей проблемы.
Наконец, после всей этой преамбулы, возникает вопрос: можно лиNSOpenGLLayer
из отдельного потока, используяCVDisplayLink
Перезвони?.
До сих пор я пытался реализовать это, но я не могу извлечь изCVDisplayLink
Перезвони. я могу только-setNeedsDisplay:TRUE
наNSOpenGLLayer
изCVDisplayLink
обратный вызов, а затем выполнить рисование в-drawInOpenGLContext:pixelFormat:forLayerTime:displayTime:
когда он автоматически вызывается какао. Но я полагаю, что так я рисую из основного потока, не так ли?
После поиска в Google для этого я даже нашелэто пост, в котором пользователь утверждает, что под Lion розыгрыш может происходить только внутри-drawInOpenGLContext:pixelFormat:forLayerTime:displayTime:
.
Я сейчас на Snow Leopard, но приложение должно работать без сбоев даже на Lion.
Я что-то пропустил?