Технические вопросы и ответы QA1502

Обеспечение аппаратно ускоренного рендеринга для приложения OpenGL

Q: Как я выбираю аппаратно ускоренное средство рендеринга и препятствую тому, чтобы оно попало в средство рендеринга программного обеспечения?

A: Как я выбираю аппаратно ускоренное средство рендеринга и препятствую тому, чтобы оно попало в средство рендеринга программного обеспечения?

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

Производительность управляемые приложения, как игры, должна остаться в аппаратно ускоренных средствах рендеринга, чтобы достигнуть и поддержать приемлемую частоту кадров.

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

Для CGL:

kCGLPFAAccelerated и kCGLPFANoRecovery

Для AGL:

AGL_ACCELERATED и AGL_NO_RECOVERY

Для NSOpenGL:

NSOpenGLPFAAccelerated и NSOpenGLPFANoRecovery

Используя *noRecovery атрибут формата пикселя не предотвратит использование обработки вершины программного обеспечения в таких случаях, где запрос получения превышает аппаратные ресурсы.

Перечисление 1  , Создающее Объект Формата пикселя с Ускоренным и атрибутами NoRecovery.

- initWithFrame:(NSRect)frameRect
{

    NSOpenGLPixelFormatAttribute attrs[] = {
          NSOpenGLPFANoRecovery,
          NSOpenGLPFAColorSize, 24,
            NSOpenGLPFADepthSize, 16,
            NSOpenGLPFADoubleBuffer,
            NSOpenGLPFAAccelerated,
            0
    };

    long rendererID;

    NSOpenGLPixelFormat* pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];

    // Report the renderer ID that this pixel format binds to
    // CGLRenderers.h contains a list of known renderers and their corresponding RendererID codes.
    // Also at http://developer.apple.com/documentation/GraphicsImaging/Reference/CGL_OpenGL/

    [pixelFormat getValues:&rendererID forAttribute:NSOpenGLPFARendererID forVirtualScreen:0];

    NSLog(@"NSOpenGLView pixelFormat RendererID = %08x", (unsigned)rendererID);

    self = [super initWithFrame:frameRect pixelFormat:pixelFormat];

    return self;
}

Раздел Techniques for Choosing Attributes Руководства по программированию OpenGL для Mac OS X предоставляет дополнительную информацию об этом предмете.

Определение, выполнится ли текущее состояние получения в GPU

CGL обеспечивает два параметра для проверки, использует ли система GPU для обработки: kCGLCPGPUVertexProcessing и kCGLCPGPUFragmentProcessing. Для проверки обработки вершины передайте вершину, постоянную функции CGLGetParameter. Для проверки обработки фрагмента передайте фрагмент, постоянный CGLGetParameter.

Перечисление 2  Используя CGL, чтобы проверить, обрабатывает ли GPU вершины и фрагменты.

BOOL gpuProcessing;
GLint fragmentGPUProcessing, vertexGPUProcessing;
CGLGetParameter (CGLGetCurrentContext(), kCGLCPGPUFragmentProcessing,
                                         &fragmentGPUProcessing);
CGLGetParameter(CGLGetCurrentContext(), kCGLCPGPUVertexProcessing,
                                         &vertexGPUProcessing);
gpuProcessing = (fragmentGPUProcessing && vertexGPUProcessing) ? YES : NO;

Вышеупомянутое перечисление установит gpuProcessing к YES для в настоящее время связанной программы построения теней, если это выполнится в GPU.



История версии документа


ДатаПримечания
18.07.2007

Новый документ, что с помощью атрибута формата пикселя NoRecovery и как проверить, выполняется ли обработка вершины и фрагмента на GPU или CPU