Подтвердить что ты не робот

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?

4b9b3361

Ответ 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].