Выбор средства рендеринга и буферных атрибутов
Средство рендеринга и буферные атрибуты определяют средства рендеринга, которые система выбирает для Вашего приложения. Каждый специфичный для Apple OpenGL, APIs обеспечивает константы, указывающие множество средства рендеринга и буферизующие атрибуты. Вы предоставляете список констант атрибута к одному из Apple функции OpenGL для выбора объекта формата пикселя. Объект формата пикселя ведет список средств рендеринга, удовлетворяющих требования, определенные теми атрибутами.
В реальном приложении выбор приписывает, искусство, потому что Вы не знаете точной комбинации аппаратного и программного обеспечения, на котором будет работать Ваше приложение. Список атрибутов, который слишком строг, может пропустить будущие возможности, или он может не возвратить средства рендеринга в некоторых системах. Например, когда больше памяти будет доступно в будущем, при указании буфера определенной глубины приложение не будет в состоянии использовать в своих интересах более крупный буфер. В этом случае Вы могли бы указать требуемый минимальный и прямой OpenGL для использования доступного максимума.
Несмотря на то, что Вы могли бы указать атрибуты, делающие Ваш взгляд содержания OpenGL и выполняющие ее лучшее, также необходимо рассмотреть, должно ли приложение работать менее - способная система с меньшим количеством скорости или подробности. Если компромиссы приемлемы, необходимо установить атрибуты соответственно.
Профили OpenGL (OS X v10.7)
Когда Ваше приложение работает на OS X v10.7, это должно всегда включать kCGLPFAOpenGLProfile
атрибут, сопровождаемый константой для профиля, функциональность которого Ваше приложение требует. Профиль влияет на различные части OpenGL в OS X:
Профиль требует, чтобы определенная версия OpenGL API была должна предоставленный средством рендеринга. Средство рендеринга может реализовать различную версию спецификации OpenGL, только если та версия реализует те же функции и константы, требуемые профилем; обычно, это означает средство рендеринга, поддерживающее более позднюю версию спецификации OpenGL, не удалявшей или изменявшей поведение, указанное в версии спецификации OpenGL Ваше приложение, которое требуют.
Профиль изменяет список расширений OpenGL, возвращенных средством рендеринга. Например, расширения, функциональность которых предоставлена версией спецификации OpenGL, которую Вы запросили, также не возвращаются в списке расширений.
На OS X профиль влияет на то, что другое средство рендеринга и буферные атрибуты могут быть включены в список атрибутов.
Следуйте этим инструкциям для выбора профиля OpenGL:
Если Вы разрабатываете новый OS X v10.7 приложение, реализуете Вашу функциональность OpenGL с помощью профиля Ядра OpenGL 3.2; включайте
kCGLOGLPVersion_3_2_Core
постоянный.Профиль ядра OpenGL 3.2 определяется Khronos и явно удаляет устаревшие функции, описанные в более ранних версиях спецификации OpenGL; далее базовый профиль мешает этим функциям добавляться назад в OpenGL с помощью расширений. Ядро OpenGL 3.2 представляет полное повреждение от конвейера стандартных функций OpenGL 1.x в пользу чистого, склонитесь основанный на программе построения теней конвейер.
При использовании профиля Ядра OpenGL 3.2 на OS X устаревшие расширения удалены везде, где их функциональность уже предоставлена OpenGL 3.2. Далее, пиксель и буферные атрибуты формата, отмеченные, как осуждается, не могут использоваться в сочетании с профилем ядра OpenGL 3.2.
Если Вы обновляете существующее приложение OS X, включаете
kCGLOGLPVersion_Legacy
постоянный.Устаревший профиль обеспечивает ту же функциональность, найденную в более ранних версиях OS X без изменений. Это продолжает поддерживать более старые расширения, а также осуждаемый пиксель и буферизовать атрибуты формата. Никакая новая функциональность не будет добавлена к устаревшему профилю в будущих версиях OS X.
Если Вы хотите использовать OpenGL 3.2 в своем приложении, но также и хотеть поддерживать более ранние версии OS X или Macs, испытывающих недостаток в поддержке оборудования OpenGL 3.2, необходимо реализовать многократные опции рендеринга OpenGL в приложении. На OS X v10.7, Ваше приложение должно сначала протестировать, чтобы видеть, поддерживается ли OpenGL 3.2. Если OpenGL 3.2 поддерживается, создайте контекст и обеспечьте его для своего пути рендеринга OpenGL 3.2. Иначе, ищите формат пикселя с помощью устаревшего профиля вместо этого.
Для получения дополнительной информации о миграции приложения к OpenGL 3.2 посмотрите Обновление Приложения для Поддержки Спецификации Ядра OpenGL 3.2.
Подсказки по выбору атрибута размера буфера
Следуйте этим инструкциям для выбора буферных атрибутов, указывающих размер буфера:
Для выбора цвета, глубины, и буферов накопления, которые больше, чем или равны размеру, который Вы указываете, используйте минимальный атрибут политики (
NSOpenGLPFAMinimumPolicy
илиkCGLPFAMinimumPolicy
).Для выбора цвета, глубины, и буферов накопления, которые являются самыми близкими к размеру, который Вы указываете, используйте самый близкий атрибут политики (
NSOpenGLPFAClosestPolicy
илиkCGLPFAClosestPolicy
).Для выбора самого большого цвета глубина и доступные буфера накопления, используют максимальный атрибут политики (
NSOpenGLPFAMaximumPolicy
илиkCGLPFAMaximumPolicy
). Пока Вы передаете значение, которое больше, чем0
, этот атрибут указывает использование цвета, глубины и буферов накопления, которые являются самым большим возможным размером.
Обеспечение, чтобы Обратное содержимое буфера осталось тем же
Когда Ваше приложение использует контекст с двойной буферизацией, оно выводит на экран представленное изображение путем вызывания функции для сбрасывания изображения на экран —NSOpenGLContext
класс flushBuffer
метод или функция CGL CGLFlushDrawable
. Когда изображение выведено на экран, содержание заднего буфера не сохраняется. В следующий раз, когда Ваше приложение хочет обновить задний буфер, оно должно полностью перерисовать сцену.
Ваше приложение может добавить атрибут запоминающего устройства (NSOpenGLPFABackingStore
или kCGLPFABackingStore
) для сохранения содержания буфера после, задний буфер сбрасывается. Добавление этого атрибута отключает некоторую оптимизацию, которую может выполнить система, который может повлиять на производительность Вашего приложения.
Обеспечение допустимого объекта формата пикселя
Подпрограммы формата пикселя ( initWithAttributes:
метод NSOpenGLPixelFormat
класс и CGLChoosePixelFormat
функция), возвращают объект формата пикселя Вашему приложению, которое Вы используете для создания контекста рендеринга. Буфер и атрибуты средства рендеринга, которые Вы предоставляете к подпрограмме формата пикселя, определяют характеристики получения OpenGL, отправленного в контекст рендеринга. Если система не может найти по крайней мере один формат пикселя, удовлетворяющий ограничения, указанные массивом атрибута, это возвращается NULL
для объекта формата пикселя. В этом случае Ваше приложение должно иметь альтернативу, гарантирующую, что оно может получить доступный объект.
Одна альтернатива должна установить Ваш массив атрибута с наименее строгим атрибутом сначала и самым строгим атрибутом в последний раз. Затем довольно просто скорректировать список атрибутов и выполнить другой запрос для объекта формата пикселя. Код в Перечислении 6-1 иллюстрирует этот метод с помощью API CGL. Заметьте, что первоначальный список атрибутов устанавливается с супердемонстрационным атрибутом в последний раз в списке. Если функция CGLChoosePixelFormat
возвраты NULL
, это очищает супердемонстрационный атрибут к NULL
и попробовал еще раз.
Перечисление 6-1 Используя API CGL для создания объекта формата пикселя
int last_attribute = 6; |
CGLPixelFormatAttribute attribs[] = |
{ |
kCGLPFAAccelerated, |
kCGLPFAColorSize, 24 |
kCGLPFADepthSize, 16, |
kCGLPFADoubleBuffer, |
kCGLPFASupersample, |
0 |
}; |
CGLPixelFormatObj pixelFormatObj; |
GLint numPixelFormats; |
long value; |
CGLChoosePixelFormat (attribs, &pixelFormatObj, &numPixelFormats); |
if( pixelFormatObj == NULL ) { |
attribs[last_attribute] = NULL; |
CGLChoosePixelFormat (attribs, &pixelFormatObj, &numPixelFormats); |
} |
if( pixelFormatObj == NULL ) { |
// Your code to notify the user and take action. |
} |
Обеспечение определенного типа средства рендеринга
Существуют времена, когда Вы хотите гарантировать, чтобы Вы получили формат пикселя, поддерживающий определенный тип средства рендеринга, такой как аппаратно ускоренное средство рендеринга. Таблица 6-1 перечисляет атрибуты, поддерживающие определенные типы средств рендеринга. Таблица отражает следующие советы для установки форматов пикселя:
Для выбора только аппаратно ускоренных средств рендеринга используйте и ускоренные и атрибуты без восстановлений.
Для использования только средства рендеринга программного обеспечения с плавающей точкой используйте надлежащую универсальную константу с плавающей точкой.
Для рендеринга к системной памяти используйте внеэкранный пиксельный атрибут. Обратите внимание на то, что эта опция рендеринга не использует аппаратное ускорение.
Для рендеринга вне экрана с аппаратным ускорением укажите пиксельный буферный атрибут. (См. Рендеринг к Пиксельному Буферу.)
Тип средства рендеринга | CGL | Какао |
---|---|---|
Аппаратно ускоренный на экране | ||
Программное обеспечение (с плавающей точкой) | ||
Системная память (не ускоренный) | ||
Аппаратно ускоренный вне экрана |
Обеспечение единственного средства рендеринга для дисплея
В некоторых случаях можно хотеть использовать определенное аппаратное средство рендеринга и ничто иное. Так как платформа OpenGL обычно обеспечивает средство рендеринга программного обеспечения как нейтрализацию в дополнение к любому аппаратному средству рендеринга, которое она выбирает, необходимо препятствовать тому, чтобы OpenGL выбрал средство рендеринга программного обеспечения в качестве опции. Чтобы сделать это, укажите атрибут без восстановлений для оконного drawable объекта.
Ограничение контекста для использования определенного дисплея, и таким образом единственного средства рендеринга, имеет свои риски. Если Ваше выполнение приложения в системе меньше, чем удовлетворительный результат, использующей больше чем один дисплей, перетаскивая оконный drawable объект от одного дисплея до другого, вероятно, уступит, или рендеринг сбоев или OpenGL использует указанное средство рендеринга и затем копирует результат во второй дисплей. Тот же неудовлетворительный результат происходит при присоединении полноэкранного контекста к другому дисплею. Если Вы принимаете решение использовать аппаратное средство рендеринга, связанное с определенным дисплеем, необходимо добавить код, обнаруживающий и обрабатывающий изменения дисплея.
Следующие примеры кода показывают, как использовать каждый специфичный для Apple OpenGL APIs для установки контекста, использующего единственное средство рендеринга. Перечисление 6-2 показывает, как установить NSOpenGLPixelFormat
возразите, что поддерживает единственное средство рендеринга. Атрибут NSOpenGLPFANoRecovery
указывает к OpenGL для не предоставления возможности нейтрализации средства рендеринга программного обеспечения.
Перечисление 6-2 , устанавливающее NSOpenGLContext
возразите для использования определенного дисплея
#import <Cocoa/Cocoa.h> |
+ (NSOpenGLPixelFormat*)defaultPixelFormat |
{ |
NSOpenGLPixelFormatAttribute attributes [] = { |
NSOpenGLPFAScreenMask, 0, |
NSOpenGLPFANoRecovery, |
NSOpenGLPFADoubleBuffer, |
(NSOpenGLPixelFormatAttribute)nil }; |
CGDirectDisplayID display = CGMainDisplayID (); |
// Adds the display mask attribute for selected display |
attributes[1] = (NSOpenGLPixelFormatAttribute) |
CGDisplayIDToOpenGLDisplayMask (display); |
return [[(NSOpenGLPixelFormat *)[NSOpenGLPixelFormat alloc] initWithAttributes:attributes] |
autorelease]; |
} |
Перечисление 6-3 показывает, как использовать CGL для установки контекста, использующего единственное средство рендеринга. Атрибут kCGLPFANoRecovery
гарантирует, что OpenGL не предоставляет возможность нейтрализации средства рендеринга программного обеспечения.
Перечисление 6-3 , Устанавливающее контекст CGL для использования определенный дисплей
#include <OpenGL/OpenGL.h> |
CGLPixelFormatAttribute attribs[] = { kCGLPFADisplayMask, 0, |
kCGLPFANoRecovery, |
kCGLPFADoubleBuffer, |
0 }; |
CGLPixelFormatObj pixelFormat = NULL; |
GLint numPixelFormats = 0; |
CGLContextObj cglContext = NULL; |
CGDirectDisplayID display = CGMainDisplayID (); |
// Adds the display mask attribute for selected display |
attribs[1] = CGDisplayIDToOpenGLDisplayMask (display); |
CGLChoosePixelFormat (attribs, &pixelFormat, &numPixelFormats); |
Разрешение оффлайновых средств рендеринга
Добавление атрибута NSOpenGLPFAAllowOfflineRenderers
позволяет OpenGL включать оффлайновые средства рендеринга в список виртуальных экранов, возвращенных в объекте формата пикселя. Apple рекомендует включать этот атрибут, потому что это позволяет рвение лучше в средах, где средства рендеринга приходят и уходят, такой как тогда, когда новый дисплей включается в Mac.
Если Ваше приложение включает NSOpenGLPFAAllowOfflineRenderers
в списке атрибутов Ваше приложение должно также наблюдать за изменениями дисплея и обновить свой контекст рендеринга. Посмотрите Обновление Контекст Рендеринга Когда Изменения Средства рендеринга или Геометрии.
OpenCL
Если Ваши приложения используют OpenCL для выполнения других вычислений, можно хотеть найти средство рендеринга OpenGL, также поддерживающее OpenCL. Чтобы сделать это, добавьте атрибут NSOpenGLPFAAcceleratedCompute
к списку атрибутов формата пикселя. Добавление этого атрибута ограничивает список средств рендеринга тем, которые также поддерживают OpenCL.
Больше информации о OpenCL может быть найдено в Руководстве по программированию OpenCL для Mac.
устаревшие (deprecated) атрибуты
Существует несколько средств рендеринга и буферизуют атрибуты, больше не рекомендующиеся или потому что они слишком узко фокусируются или больше не полезные. Ваше приложение должно переехать от использования любого из этих атрибутов:
Устойчивый атрибут (
NSOpenGLPFARobust
илиkCGLPFARobust
) указывает только те средства рендеринга, не имеющие никаких видов отказа связанными с отсутствием ресурсов видеокарты.Атрибут многократного экрана (
NSOpenGLPFAMultiScreen
илиkCGLPFAMultiScreen
) указывает только те средства рендеринга, которые могут управлять больше чем одним экраном за один раз.Многопроцессорно-безопасный атрибут (
kCGLPFAMPSafe
) указывает только те средства рендеринга, которые ориентированы на многопотоковое исполнение. Этот атрибут осуждается в OS X, потому что все средства рендеринга могут принять команды для потоков, работающих на втором процессоре. Однако это не означает, что все средства рендеринга ориентированы на многопотоковое исполнение или повторно используемы. Посмотрите Параллелизм и OpenGL.Совместимый атрибут (
NSOpenGLPFACompliant
илиkCGLPFACompliant
) указывает только совместимые OpenGL средства рендеринга. Все средства рендеринга OS X совместимы OpenGL, таким образом, этот атрибут больше не полезен.Полноэкранный атрибут (
kCGLPFAFullScreen
) требуемые специальные полноэкранные контексты. Экранный атрибут окна (kCGLPFAWindow)
требуемый контекст для поддержки оконных контекстов. OS X больше не требует, чтобы специальный полноэкранный контекст был создан, поскольку он автоматически предоставляет тем же выигрышам в производительности должным образом отформатированное окно.Внеэкранный буферный атрибут (
kCGLPFAOffScreen
) выбирает средства рендеринга, способные к рендерингу к внеэкранной памяти. Вместо этого используйте объект кадрового буфера в качестве цели рендеринга и считайте конечные результаты назад в память приложения.Пиксельные буферные атрибуты (
kCGLPFAPBuffer
иkCGLPFARemotePBuffer
больше не рекомендуются; используйте объекты кадрового буфера вместо этого.Вспомогательный буферный атрибут (
kCGLPFAAuxBuffers
) указывает число требуемых вспомогательных буферов, которых требует Ваше приложение. Вспомогательные буферы не поддерживаются профилем Ядра OpenGL 3.2. Поскольку вспомогательные буферы не поддерживаются,kCGLPFAAuxDepthStencil
атрибут, изменяющий его, также осуждается.Атрибут размера буфера накопления (
kCGLPFAAccumSize
) указывает желаемый размер для буфера накопления. Буфера накопления не поддерживаются Профилем Ядра OpenGL 3.2.