glFlush()与[[self openGLContext] flushBuffer]与glFinish与glSwapAPPLE与aglSwapBuffers的区别

19
在使用NSOpenGLView时,有几个类似的OpenGL操作:
  • glFlush()
  • [[self openGLContext] flushBuffer]
  • glFinish()
  • glSwapAPPLE
  • aglSwapBuffers
每个应该在什么情况下使用?
在一个示例应用程序中,苹果公司使用glFlush(),然后是[[self openGLContext] flushBuffer]。他们为什么要同时使用这两者?
如果我正在使用双缓冲Cocoa NSOpenGLView,则哪种方法是正确的?

虽然我没有使用过苹果(因此这不是答案),但在使用双缓冲时,通常应该调用类似于swapBuffers函数的东西。在这种情况下,不需要flush或finish函数,因为缓冲区交换应该等待所有先前命令的完成,或者更好的是它甚至可以是异步的,这样您就可以在无需等待命令完成的情况下执行其他工作(就像glFinish一样)。 - Christian Rau
3个回答

11

小心![[self openGLContext] flushBuffer]并不仅仅是gFlush()的Objective-C包装器。这个函数(- (void)flushBuffer)在苹果文档中只有当你在像素格式中设置了双缓冲时才会起作用。

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

    NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] 
                                            initWithAttributes:attributes];
否则,您必须使用glFlush();。直到我看到NSOpenGLContext类参考文献中的关键行,我才花了很长时间。

2
正确的方法是调用[[self openGLContext] flushBuffer]

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

glSwapAPPLE()和aglSwapBuffers()是由苹果提供的扩展,用于将后备缓冲区的内容显示到屏幕上(在Windows上是wglSwapBuffers())。您应该只使用其中之一,因为它们实际上做的事情是相同的。我建议使用AGL方法,因为它类似于WGL、EGL等。

[[self openGLContext] flushBuffer]从外观上看可能是一个调用glFlush()的Objective-C包装器。我想象不出它还能做什么。


5
根据你提供的链接,NSOpenGLContext 类中的 flushBuffer 方法在双缓冲模式下实际上执行了一个缓冲交换(以及之前执行了一个 glFlush)。因此,这实际上是唯一需要的功能。而且由于他已经使用了 NS 类,我建议使用这个方法来代替其他缓冲交换函数。 - Christian Rau
3
aglSwapBuffers 是 Carbon 应用程序的 OpenGL API 的一部分,因此我认为它不应该在 Cocoa 应用程序中使用。 - JWWalker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接