GlFlush() vs [[self openGLContext] flushBuffer] vs glFinish vs glSwapAPPLE vs aglSwapBuffers
При работе с NSOpenGLView существует несколько аналогичных операций OpenGL:
-
glFlush()
-
[[self openGLContext] flushBuffer]
-
glFinish()
- glSwapAPPLE
- aglSwapBuffers
Когда каждый из них будет использоваться?
В примере приложения Apple использует glFlush()
, а затем [[self openGLContext] flushBuffer]
. Почему они используют оба эти?
Каким будет правильный подход, если я использую двухбуферизованный Cocoa NSOpenGLView?
Ответы
Ответ 1
Вы просмотрели это? В нем объясняется, когда следует использовать glFlush() и glFinish(). Обе функции OpenGL контролируют выполнение и синхронизацию команд. Как правило, вы захотите использовать эти функции при многопоточном рендеринге, иначе не должно быть необходимости.
glSwapAPPLE() и aglSwapBuffers() - это расширения, предоставляемые Apple для отображения содержимого бэкбуфера на экран (в Windows это wglSwapBuffers()). Вы должны использовать один, но не оба, поскольку они действительно делают то же самое. Я бы придерживался метода AGL, поскольку он аналогичен WGL, EGL и т.д.
[[self openGLContext] flushBuffer]
, вероятно, является объектной C-оболочкой glFlush() из ее взглядов. Я не могу представить, что он делает что-то еще.
Ответ 2
Будьте осторожны! [[self openGLContext] flushBuffer]
- это не только обертка Objective-C для gFlush()
. Эта функция (- (void)flushBuffer
в Apple Documentation) работает только в том случае, если вы устанавливаете двойной буфер в своем пиксельном формате, например
NSOpenGLPixelFormatAttribute attributes [] =
{
NSOpenGLPFADoubleBuffer,
// other presets like
// NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,
// NSOpenGLPFADepthSize, 32,
0
};
NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc]
initWithAttributes:attributes];
В противном случае вы должны использовать glFlush();
Мне потребовалось много времени, пока я не увидел существенную строку в NSOpenGLContext Reference Reference.
Ответ 3
Правильный подход - это просто вызов [[self openGLContext] flushBuffer]
.