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

Синхронизация рендеринга OpenGL обновляет к вертикальному обновлению дисплея

Q: Как я избегаю рваться в OpenGL?

A: Как я избегаю рваться в OpenGL?

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

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

Одна потенциальная причина иметь нулевой интервал подкачки состоит в том, чтобы измерить максимальное возможное число кадров, которые могут быть представлены в течение данного времени. Это вызвано тем, что устанавливая интервал подкачки в ненулевое значение прописные буквы уровень эффективного кадра Вашего приложения к целочисленному делителю частоты обновления дисплея. Например, если Ваше приложение может завершить свой рендеринг в течение одного периода обновления дисплея, частота кадров будет ограничена в частоте обновления. Если, однако, Ваше приложение занимает больше времени, чем один период обновления, то буферная подкачка должна будет ожидать до следующего события обновления. Это эффективно отбрасывает Вашу частоту кадров к 1 / [время для рендеринга кадра, окруженного к ближайшей вертикальной длительности повтора].

NSOpenGLContexts

Перечисление 1 показывает, как включить и отключить синхронизацию в NSOpenGLContext.

Перечисление 1  , Синхронизирующее буфер, подкачивает к VBL в NSOpenGLView.

long swapInterval = 1; // request synchronization //long swapInterval = 0; // disable synchronization  [[self openGLContext] setValues:&swapInterval forParameter: NSOpenGLCPSwapInterval];

Контексты AGL

Перечисление 2 показывает, как включить и отключить синхронизацию с помощью AGL API.

Перечисление 2  , Синхронизирующее буфер, подкачивает к VBL в текущем Контексте AGL.

long swapInterval = 1; // request synchronization
//long swapInterval =0; // disable synchronization

AGLContext ctx = aglGetCurrentContext();
if (NULL != ctx) aglSetInteger(ctx, AGL_SWAP_INTERVAL, &swapInterval);

Контексты CGL

Перечисление 3 показывает, как включить и отключить синхронизацию с помощью API CGL.

Перечисление 3  , Синхронизирующее буфер, подкачивает к VBL в текущем Контексте CGL

long swapInterval = 1; // request synchronization
//long swapInterval = 0; // disable synchronization

CGLContextObj ctx = CGLGetCurrentContext();
if (NULL != ctx) CGLSetParameter(ctx, kCGLCPSwapInterval, &swapInterval);

Значения по умолчанию GLUT

GLUT базировался, программы имеют дополнительное удобство настройки по умолчанию. Настройка по умолчанию только оценена во время запуска приложения, таким образом, для изменения для вступления в силу должно быть перезапущено приложение.

К значениям по умолчанию GLUT можно получить доступ в их меню приложения:

Рисунок 1  , Получающий доступ к предпочтениям приложения GLUT

Для включения синхронизации к VBL значением по умолчанию выбирают «Default Synchronize to Vertical Blank» и перезапускают приложение.

Рисунок 2  , Выбирающий значение по умолчанию синхронизации.

Ссылки

Руководство по программированию OpenGL для Mac OS X имеет раздел об этой теме под областью методов наиболее успешной практики улучшающейся производительности.



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


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

Новый документ это, как избежать рваться путем синхронизации рендеринга с дисплеем VBL