Рисовать из отдельной темы с 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.

Я что-то пропустил?

Ответы на вопрос(1)

Ваш ответ на вопрос