Резкое замедление с использованием NSOpenGLView на основе слоев - PullRequest
1 голос
/ 18 мая 2011

Мне нужно было отобразить некоторые виджеты Какао поверх NSOpenGLView в существующем приложении. Я последовал примеру в коде Apple LayerBackedOpenGLView. Для NSOpenGLView задан слой подложки с использованием:

[glView setWantsLayer:YES]

Затем Какао NSView с виджетами добавляется как подпредставление glView. Это в основном работает и работает вдвое быстрее, чем мой предыдущий подход, когда я добавил NSView, содержащий виджеты, в дочернее окно окна, содержащего glView (это было другое решение, которое я нашел в Интернете).

Были две проблемы.

  • Во-первых, некоторые текстуры, которые я использую с наложением, больше не дают правильного наложения. После небольшого поиска мне показалось, что мне может понадобиться очистить альфа-канал OpenGLView. Этот фрагмент кода, который я вызываю после рисования фрейма, похоже, решил эту проблему:

Код:

glColorMask(FALSE, FALSE, FALSE, TRUE); //This ensures that only alpha will be effected
glClearColor(0, 0, 0, 1); //alphaValue - Value to which you need to clear
glClear(GL_COLOR_BUFFER_BIT);
glColorMask(TRUE, TRUE, TRUE, TRUE); //Put color mask back to what it was.

Может кто-нибудь объяснить, зачем это нужно при использовании CALayer, но не без?

  • Вторая проблема, для которой у меня нет решения. Кажется, что когда я перемещаюсь к той части сцены, где наблюдалась проблема # 1, частота кадров падает с примерно 110 FPS до 10 FPS. Опять же, это начало происходить только после того, как я добавил слой подложки. Это не всегда происходит. Иногда FPS остается высоким при панорамировании этой части сцены, но это редко. Я предполагаю, что это должно быть что-то с тем, как текстуры смешиваются здесь, но я понятия не имею, что.

Есть мысли?

1 Ответ

0 голосов
/ 18 мая 2011

Я нашел способ обойти замедление.Представление OpenGL имеет вид HUD (отображение заголовка), который идет поверх него.Я установил другой NSView в качестве подпредставления, если оно.И HUD, и подпредставление имеют много альфа-манипуляций и по какой-то причине вызвали реальное замедление в компоновке слоев.Я мог легко установить это подпредставление как подпредставление представления OpenGL, и когда я сделал это, все снова ускорилось.Поэтому, хотя я не до конца понимаю замедление, у меня есть хороший способ его обойти.

...