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

Pet*_*isu 18 opengl macos cocoa

使用NSOpenGLView时,有几个类似的OpenGL操作:

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

什么时候应该使用它们?

在示例应用程序中,Apple使用glFlush(),然后使用[[self openGLContext] flushBuffer].他们为什么要同时使用这两种?

如果我使用双缓冲的Cocoa NSOpenGLView,那么正确的方法是什么?

Mic*_*ner 9

小心![[self openGLContext] flushBuffer]不仅仅是一个Objective-C包装器gFlush().此功能(- (void)flushBufferApple文档中)仅在您以像素格式设置双缓冲区时才有效

NSOpenGLPixelFormatAttribute attributes [] =
    {
        NSOpenGLPFADoubleBuffer,
        // other presets like
        // NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,
        // NSOpenGLPFADepthSize, 32,
        0
    };

    NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] 
                                            initWithAttributes:attributes];
Run Code Online (Sandbox Code Playgroud)

否则你必须使用glFlush();我花了很长时间才看到NSOpenGLContext类参考中的基本行.


Jas*_*eer 1

你看过这个吗?它解释了何时使用 glFlush() 和 glFinish()。两者都是控制命令执行和同步的 OpenGL 函数。通常,您在进行多线程渲染时会希望使用这些函数,否则就没有任何需要。

glSwapAPPLE() 和 aglSwapBuffers() 是 Apple 提供的扩展,用于将后台缓冲区的内容显示到屏幕上(在 Windows 上为 wglSwapBuffers())。您应该使用其中之一,但不能同时使用两者,因为它们实际上做同样的事情。我会坚持使用 AGL 方法,因为它类似于 WGL、EGL 等。

[[self openGLContext] flushBuffer]从表面上看,它可能是 glFlush() 的客观 C 包装器。我无法想象它还能做任何其他事情。

  • 根据您的链接,“NSOpenGLContext”类的“flushBuffer”方法实际上是在双缓冲模式下进行缓冲区交换(以及之前的“glFlush”)。所以这实际上是唯一需要的功能。无论如何,由于他正在使用 NS 类,我宁愿建议使用这个函数而不是其他交换函数。 (5认同)
  • `aglSwapBuffers` 是 Carbon 应用程序的 OpenGL API 的一部分,因此我认为它不应该在 Cocoa 应用程序中使用。 (3认同)