Оптимизация OpenGL для высокого разрешения

OpenGL является основанный на пикселе API так NSOpenGLView класс не обеспечивает поверхности с высокой разрешающей способностью по умолчанию. Поскольку добавление большего количества пикселей к renderbuffers имеет импликации производительности, необходимо явно выбрать в поддерживать экраны с высокой разрешающей способностью. Просто включить поддержку с высокой разрешающей способностью для представления OpenGL. Когда Вы сделаете, Вы захотите выполнить несколько дополнительных задач гарантировать самый лучший опыт с высокой разрешающей способностью для Ваших пользователей.

Включите поддержку с высокой разрешающей способностью для представления OpenGL

Можно выбрать в к высокому разрешению путем вызова метода setWantsBestResolutionOpenGLSurface: когда Вы инициализируете представление и предоставление YES как параметр:

[self  setWantsBestResolutionOpenGLSurface:YES];

Если Вы не выбираете в, система увеличивает представленные результаты.

wantsBestResolutionOpenGLSurface свойство важно только для представлений к который NSOpenGLContext объект связывается. Его значение не влияет на поведение других представлений. Для совместимости, wantsBestResolutionOpenGLSurface значения по умолчанию к NO, обеспечение кадрового буфера 1 пикселя за точку независимо от отступающего масштабного коэффициента для дисплея представление занимает. Установка этого свойства к YES поскольку высказанное мнение заставляет AppKit выделять кадровый буфер более высокого разрешения в надлежащих случаях для отступающего масштабного коэффициента и целевого дисплея.

Функционировать правильно с wantsBestResolutionOpenGLSurface набор к YES, представление должно выполнить корректные преобразования между модулями представления (точки) и пиксельные модули по мере необходимости. Например, установившаяся практика передачи ширины и высоты [self bounds] к glViewport() приведет к неправильным результатам в высоком разрешении, потому что параметры передали glViewport() функция должна быть в пикселях. В результате Вы станете только частичными вместо полного обзора поверхности рендеринга. Вместо этого используйте границы запоминающего устройства:

 [self convertRectToBacking:[self bounds]];

Можно также выбрать в к высокому разрешению путем включения установки Supports Hi-Res Backing для представления OpenGL в XCode, как показано на рисунке 3-1.

Рисунок 3-1  , Разрешающий поддержку с высокой разрешающей способностью для представления OpenGL

Установите область просмотра для поддержки высокого разрешения

Размерности области просмотра находятся в пикселях относительно поверхности OpenGL. Передайте ширину и высоту к glViewPort и используйте 0,0 для x и y смещения. Перечисление 3-1 показывает, как получить размерности представления в пикселях и принять размер запоминающего устройства во внимание.

Перечисление 3-1  , Настраивающее область просмотра для рисования

- (void)drawRect:(NSRect)rect   // NSOpenGLView subclass
{
    // Get view dimensions in pixels
    NSRect backingBounds = [self convertRectToBacking:[self bounds]];
 
    GLsizei backingPixelWidth  = (GLsizei)(backingBounds.size.width),
            backingPixelHeight = (GLsizei)(backingBounds.size.height);
 
    // Set viewport
    glViewport(0, 0, backingPixelWidth, backingPixelHeight);
 
    // draw…
}

Вы не должны выполнять рендеринг в пикселях, но действительно необходимо знать о системе координат, в которой Вы хотите представить. Например, если Вы захотите представить в точках, то этот код будет работать:

glOrtho(NSWidth(bounds), NSHeight(bounds),...)

Скорректируйте модель и текстурируйте активы

Если Вы выбираете в к получению с высокой разрешающей способностью, также необходимо скорректировать модель и активы текстуры приложения. Например, при работе дисплея с высокой разрешающей способностью, Вы могли бы хотеть выбрать большие модели и более подробные текстуры для использования в своих интересах увеличенного числа пикселей. С другой стороны, на дисплее стандартного разрешения, можно продолжать использовать меньшие модели и текстуры.

Если Вы создаете и текстуры кэша при инициализации приложения Вы могли бы хотеть рассмотреть стратегию, размещающую изменение текстуры на основе разрешения дисплея.

Проверьте на вызовы, определенные в пиксельных размерностях

Эти функции используют пиксельные размерности:

Настройте производительность OpenGL для высокого разрешения

Производительность является важным фактором при определении, поддерживать ли содержание с высокой разрешающей способностью. Увеличение вчетверо пикселей, происходящее, когда Вы выбираете в к высокому разрешению, требует большего количества работы процессором фрагмента. Если Ваше приложение выполняет много вычислений на фрагмент, увеличение пикселей могло бы сократить свою частоту кадров. Если Ваше выполнение приложения значительно медленнее в высоком разрешении, рассмотрите следующие опции:

Лучшее решение зависит от потребностей Вашего приложения OpenGL; необходимо протестировать больше чем одну из этих опций и выбрать подход, обеспечивающий лучший баланс между производительностью и качеством изображения.

Используйте поддержанное уровнем представление для текста перекрытия на содержании OpenGL

Когда Вы рисуете стандартные средства управления и текст Какао к поддержанному уровнем представлению, системные дескрипторы, масштабирующие содержание того уровня для Вас. Необходимо выполнить только несколько шагов, чтобы установить и использовать уровень. Сравните средства управления и текст в стандартных и высоких разрешениях, как показано на рисунке 3-2. Текст выглядит одинаково на обоих без любой дополнительной работы с Вашей стороны.

Рисунок 3-2  текстовое наложение масштабируется автоматически для (оставленного) стандартного разрешения и высокое разрешение (право)
bullet
Устанавливать поддержанное уровнем представление для содержания OpenGL
  1. Установите wantsLayer свойство Вашего NSOpenGLView подкласс к YES.

    Включение wantsLayer свойство NSOpenGLView объект активирует поддержанный уровнем рендеринг представления OpenGL. Рисование поддержанного уровнем представления OpenGL продолжается главным образом обычно посредством представления drawRect: метод. Поддержанный уровнем режим рендеринга использует свое собственное NSOpenGLContext объект, который отличен от NSOpenGLContext то, что использование представления для того, чтобы подойти к концу не уровень поддержало режим.

    AppKit автоматически создает этот контекст и присваивает его представлению путем вызова setOpenGLContext: метод. Представление openGLContext средство доступа возвратит поддержанный уровнем контекст OpenGL (а не не уровень поддержал контекст), в то время как представление работает в поддержанном уровнем режиме.

  2. Создайте содержание уровня или как файл XIB или программно.

    Средства управления, показанные на рисунке 3-2, создавались в файле XIB путем разделения на подклассы NSBox и использование статического текста со множеством стандартных средств управления. Используя этот подход позволяет NSBox подкласс для игнорирования событий от нажатия мыши, все еще позволяя пользователю взаимодействовать с содержанием OpenGL.

  3. Добавьте уровень к представлению OpenGL путем вызова addSublayer: метод.

Используйте окно приложения для полноэкранной работы

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

Необходимо избежать изменять режим отображения системы.

Преобразуйте координатное пространство, когда поражено тестируя

Всегда преобразовывайте координаты события окна при выполнении тестирования хита в OpenGL. locationInWindow метод NSEvent класс возвращает расположение получателя в основной системе координат окна. Тогда необходимо вызвать convertPoint:fromView: метод для получения локальных координат для представления OpenGL.

NSPoint aPoint = [theEvent locationInWindow];
NSPoint localPoint = [myOpenGLView convertPoint:aPoint fromView:nil];