Выбор средства рендеринга и буферных атрибутов

Средство рендеринга и буферные атрибуты определяют средства рендеринга, которые система выбирает для Вашего приложения. Каждый специфичный для Apple OpenGL, APIs обеспечивает константы, указывающие множество средства рендеринга и буферизующие атрибуты. Вы предоставляете список констант атрибута к одному из Apple функции OpenGL для выбора объекта формата пикселя. Объект формата пикселя ведет список средств рендеринга, удовлетворяющих требования, определенные теми атрибутами.

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

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

Профили OpenGL (OS X v10.7)

Когда Ваше приложение работает на OS X v10.7, это должно всегда включать kCGLPFAOpenGLProfile атрибут, сопровождаемый константой для профиля, функциональность которого Ваше приложение требует. Профиль влияет на различные части OpenGL в OS X:

Следуйте этим инструкциям для выбора профиля OpenGL:

Для получения дополнительной информации о миграции приложения к OpenGL 3.2 посмотрите Обновление Приложения для Поддержки Спецификации Ядра OpenGL 3.2.

Подсказки по выбору атрибута размера буфера

Следуйте этим инструкциям для выбора буферных атрибутов, указывающих размер буфера:

Обеспечение, чтобы Обратное содержимое буфера осталось тем же

Когда Ваше приложение использует контекст с двойной буферизацией, оно выводит на экран представленное изображение путем вызывания функции для сбрасывания изображения на экран —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 перечисляет атрибуты, поддерживающие определенные типы средств рендеринга. Таблица отражает следующие советы для установки форматов пикселя:

Табличные 6-1  типы Средства рендеринга и атрибуты формата пикселя

Тип средства рендеринга

CGL

Какао

Аппаратно ускоренный на экране

kCGLPFAAccelerated

kCGLPFANoRecovery

NSOpenGLPFAAccelerated

NSOpenGLPFANoRecovery

Программное обеспечение (с плавающей точкой)

kCGLPFARendererID

kCGLRendererGenericFloatID

NSOpenGLPFARendererID

kCGLRendererGenericFloatID

Системная память (не ускоренный)

kCGLPFAOffScreen

NSOpenGLPFAOffScreen

Аппаратно ускоренный вне экрана

kCGLPFAPBuffer

NSOpenGLPFAPixelBuffer

Обеспечение единственного средства рендеринга для дисплея

В некоторых случаях можно хотеть использовать определенное аппаратное средство рендеринга и ничто иное. Так как платформа 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) атрибуты

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