Рисование на полный экран

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

Рисунок 4-1  , Получающий содержание OpenGL на полный экран
Drawing OpenGL content to the full screen

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

Для получения информации об и полноэкранном получении с высокой разрешающей способностью посмотрите Использование Окно приложения для Полноэкранной Работы.

Создавание полноэкранного приложения

Создание полноэкранного контекста очень просто. Ваше приложение должно выполнить эти шаги:

  1. Создайте окно размера экрана на дисплее, который Вы хотите принять:

    NSRect mainDisplayRect = [[NSScreen mainScreen] frame];
    NSWindow *fullScreenWindow = [[NSWindow alloc] initWithContentRect: mainDisplayRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:YES];
  2. Установите уровень окна, чтобы быть выше строки меню.:

    [fullScreenWindow setLevel:NSMainMenuWindowLevel+1];
  3. Выполните любую другую конфигурацию окна, которой Вы желаете:

    [fullScreenWindow setOpaque:YES];
    [fullScreenWindow setHidesOnDeactivate:YES];
  4. Создайте представление с контекстом OpenGL с двойной буферизацией и присоедините его к окну:

    NSOpenGLPixelFormatAttribute attrs[] =
    {
        NSOpenGLPFADoubleBuffer,
        0
    };
    NSOpenGLPixelFormat* pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
     
    NSRect viewRect = NSMakeRect(0.0, 0.0, mainDisplayRect.size.width, mainDisplayRect.size.height);
    MyOpenGLView *fullScreenView = [[MyOpenGLView alloc] initWithFrame:viewRect pixelFormat: pixelFormat];
    [fullScreenWindow setContentView: fullScreenView];
  5. Покажите окно:

    [fullScreenWindow makeKeyAndOrderFront:self];

Это - все, что необходимо сделать. Ваше содержание находится в окне, которое является выше большей части другого содержания, но потому что это находится в окне, OS X может все еще показать критические элементы UI выше Вашего содержания когда необходимый (такие как ошибочные диалоговые окна). Когда нет никакого содержания выше Вашего полноэкранного окна, OS X автоматически пытается оптимизировать производительность этого контекста. Например, когда Ваше приложение вызывает flushBuffer на NSOpenGLContext объект, система может подкачать буферы вместо того, чтобы копировать содержание заднего буфера к переднему буферу. Когда Ваше приложение добавляет, эта оптимизация производительности не применяется NSOpenGLPFABackingStore припишите контексту. Поскольку система может принять решение подкачать буферы, а не скопировать их, Ваше приложение должно полностью перерисовать сцену после каждого вызова к flushBuffer. Для получения дополнительной информации о NSOpenGLPFABackingStore, посмотрите Обеспечение, Чтобы Обратное Содержимое буфера Осталось Тем же.

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