Синхронизация рендеринга 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 можно получить доступ в их меню приложения:

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

Ссылки
Руководство по программированию OpenGL для Mac OS X имеет раздел об этой теме под областью методов наиболее успешной практики улучшающейся производительности.
История версии документа
| Дата | Примечания |
|---|---|
| 16.07.2007 | Новый документ это, как избежать рваться путем синхронизации рендеринга с дисплеем VBL |