Оптимизация 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.
Установите область просмотра для поддержки высокого разрешения
Размерности области просмотра находятся в пикселях относительно поверхности 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),...) |
Скорректируйте модель и текстурируйте активы
Если Вы выбираете в к получению с высокой разрешающей способностью, также необходимо скорректировать модель и активы текстуры приложения. Например, при работе дисплея с высокой разрешающей способностью, Вы могли бы хотеть выбрать большие модели и более подробные текстуры для использования в своих интересах увеличенного числа пикселей. С другой стороны, на дисплее стандартного разрешения, можно продолжать использовать меньшие модели и текстуры.
Если Вы создаете и текстуры кэша при инициализации приложения Вы могли бы хотеть рассмотреть стратегию, размещающую изменение текстуры на основе разрешения дисплея.
Проверьте на вызовы, определенные в пиксельных размерностях
Эти функции используют пиксельные размерности:
glViewport (GLint x, GLint y, GLsizei width, GLsizei height)
glScissor (GLint x, GLint y, GLsizei width, GLsizei height)
glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, ...)
glLineWidth (GLfloat width)
glRenderbufferStorage (..., GLsizei width, GLsizei height)
glTexImage2D (..., GLsizei width, GLsizei height, ...)
Настройте производительность OpenGL для высокого разрешения
Производительность является важным фактором при определении, поддерживать ли содержание с высокой разрешающей способностью. Увеличение вчетверо пикселей, происходящее, когда Вы выбираете в к высокому разрешению, требует большего количества работы процессором фрагмента. Если Ваше приложение выполняет много вычислений на фрагмент, увеличение пикселей могло бы сократить свою частоту кадров. Если Ваше выполнение приложения значительно медленнее в высоком разрешении, рассмотрите следующие опции:
Оптимизируйте производительность программы построения теней фрагмента. (См. Настройку Вашего Приложения OpenGL.)
Выберите более простой алгоритм для реализации в программе построения теней фрагмента. Это сокращает качество каждого отдельного пикселя для обеспечения рендеринга полного изображения в более высоком разрешении.
Используйте дробный масштабный коэффициент между 1,0 и 2.0. Масштабный коэффициент 1,5 обеспечивает лучшее качество, чем масштабный коэффициент 1,0, но это должно заполнить меньше пикселей, чем изображение, масштабируемое к 2,0.
Мультивыборка сглаживания может быть дорогостоящей с предельной выгодой в высоком разрешении. При использовании его Вы могли бы хотеть пересмотреть.
Лучшее решение зависит от потребностей Вашего приложения OpenGL; необходимо протестировать больше чем одну из этих опций и выбрать подход, обеспечивающий лучший баланс между производительностью и качеством изображения.
Используйте поддержанное уровнем представление для текста перекрытия на содержании OpenGL
Когда Вы рисуете стандартные средства управления и текст Какао к поддержанному уровнем представлению, системные дескрипторы, масштабирующие содержание того уровня для Вас. Необходимо выполнить только несколько шагов, чтобы установить и использовать уровень. Сравните средства управления и текст в стандартных и высоких разрешениях, как показано на рисунке 3-2. Текст выглядит одинаково на обоих без любой дополнительной работы с Вашей стороны.
Установите
wantsLayer
свойство ВашегоNSOpenGLView
подкласс кYES
.Включение
wantsLayer
свойствоNSOpenGLView
объект активирует поддержанный уровнем рендеринг представления OpenGL. Рисование поддержанного уровнем представления OpenGL продолжается главным образом обычно посредством представленияdrawRect:
метод. Поддержанный уровнем режим рендеринга использует свое собственноеNSOpenGLContext
объект, который отличен отNSOpenGLContext
то, что использование представления для того, чтобы подойти к концу не уровень поддержало режим.AppKit автоматически создает этот контекст и присваивает его представлению путем вызова
setOpenGLContext:
метод. ПредставлениеopenGLContext
средство доступа возвратит поддержанный уровнем контекст OpenGL (а не не уровень поддержал контекст), в то время как представление работает в поддержанном уровнем режиме.Создайте содержание уровня или как файл XIB или программно.
Средства управления, показанные на рисунке 3-2, создавались в файле XIB путем разделения на подклассы
NSBox
и использование статического текста со множеством стандартных средств управления. Используя этот подход позволяетNSBox
подкласс для игнорирования событий от нажатия мыши, все еще позволяя пользователю взаимодействовать с содержанием OpenGL.Добавьте уровень к представлению OpenGL путем вызова
addSublayer:
метод.
Используйте окно приложения для полноэкранной работы
Для лучшего пользовательского опыта, если Вы хотите, чтобы Ваше приложение выполнило полный экран, создают окно, покрывающее весь экран. Этот подход предлагает два преимущества:
Система обеспечивает оптимизированную производительность контекста.
Пользователи будут в состоянии видеть критические системные диалоговые окна выше Вашего содержания.
Необходимо избежать изменять режим отображения системы.
Преобразуйте координатное пространство, когда поражено тестируя
Всегда преобразовывайте координаты события окна при выполнении тестирования хита в OpenGL. locationInWindow
метод NSEvent
класс возвращает расположение получателя в основной системе координат окна. Тогда необходимо вызвать convertPoint:fromView:
метод для получения локальных координат для представления OpenGL.
NSPoint aPoint = [theEvent locationInWindow]; |
NSPoint localPoint = [myOpenGLView convertPoint:aPoint fromView:nil]; |