Я работаю над приложением, которое должно рисовать с помощью 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.
Я что-то упустил?