glFlush () против [[self openGLContext] flushBuffer] против glFinish против glSwapAPPLE против aglSwapBuffers - PullRequest
18 голосов
/ 11 августа 2011

Существует несколько аналогичных операций OpenGL при работе с NSOpenGLView:

  • glFlush()
  • [[self openGLContext] flushBuffer]
  • glFinish()
  • glSwapAPPLE
  • aglSwapBuffers

Когда следует использовать каждый из них?

В примере приложения Apple использует glFlush(), за которым следует [[self openGLContext] flushBuffer]. Почему они используют оба из них?

Каков будет правильный подход, если я использую какао с двойной буферизацией NSOpenGLView?

Ответы [ 3 ]

9 голосов
/ 29 ноября 2012

Будь осторожен! [[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 .

2 голосов
/ 13 июля 2012

Правильный подход - просто позвонить [[self openGLContext] flushBuffer].

2 голосов
/ 15 августа 2011

Вы смотрели на это ? Это объясняет, когда использовать glFlush () и glFinish (). Обе функции OpenGL контролируют выполнение и синхронизацию команд. Как правило, вы захотите использовать эти функции при многопоточном рендеринге, иначе в этом не должно быть необходимости.

glSwapAPPLE () и aglSwapBuffers () - это расширения, предоставляемые Apple для отображения содержимого резервного буфера на экране (в Windows это wglSwapBuffers ()). Вы должны использовать любой из них, но не оба, поскольку они действительно делают то же самое. Я бы придерживался метода AGL, так как он аналогичен WGL, EGL и т. Д.

[[self openGLContext] flushBuffer], вероятно, является целевой оболочкой C для glFlush (), судя по всему. Я не могу представить, что это делает что-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...