在OSX上升级项目到OpenGL 4.1 - 使用NSOpenGLProfileVersion4_1Core会使渲染变慢。

3

我正在尝试将一个OSX的OpenGL项目更新到OpenGL 4.1。我的着色器使用#version 410,一切都工作得很好,并且非常流畅。今天我注意到有一个新的NSOpenGLPFAOpenGLProfile值用于4.1版本,所以我将像素格式配置文件从NSOpenGLProfileVersion3_2Core更新为NSOpenGLProfileVersion4_1Core,但现在渲染变得极其缓慢。我的像素格式初始化代码如下:

NSOpenGLPixelFormatAttribute attrs[] =
{
    NSOpenGLPFADoubleBuffer,
    NSOpenGLPFADepthSize, 24,
    NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core,
    0
};

NSOpenGLPixelFormat *pf =
    [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];

有人知道这为什么会慢这么多吗?我是否需要更新其他内容?

我不熟悉那个常量。当10.9发布并引入GL 4.1上下文时,该常量仍为NSOpenGLProfileVersion3_2Core,人们认为该常量提供了平台支持的最高版本上下文。这似乎几乎是给你参考软件渲染路径而不是硬件。 - Andon M. Coleman
谢谢您的回复!我看到glfw项目更新并使用了这个常量,所以我认为它应该是能够正常运行的。不过,我相信您说得对 - 当我使用4_1常量进行渲染时,CPU使用率会飙升。也许它只在Yosemite上有效... - Mike Hays
啊,你说得完全正确。我查了github,在nsgl_context.m的第131行遇到了一个��处理器指令,它只适用于OS X 10.10。所以看起来这是一个特定于10.10的改变。 - Andon M. Coleman
是的,听起来你可能正在使用软件回退。你可以尝试使用GL_VENDORGL_RENDERERglGetString()。我相信如果你得到了完全的回退,这些值会发生变化。否则,对于部分回退,我认为OpenGL Profiler中曾经有一个选项可以显示回退。你的GPU是否在https://developer.apple.com/opengl/capabilities/上被列为支持4.1? - Reto Koradi
这绝对是软件回退。GL_VENDOR 报告 Apple Computer, Inc.,而 GL_RENDERER 报告 Apple Software Renderer 用于 4.1 像素格式配置文件。当使用 NSOpenGLProfileVersion3_2Core 时,GL_MAJOR_VERSION/GL_MINOR_VERSION 报告为 4.1,并且我在我的着色器中使用 #version 410,正如我在问题开头所说的那样。我的显卡确实支持 4.1。通过 Apple 论坛确认这在 10.10 中已修复(我使用的是 10.9.5)。 - Mike Hays
2个回答

2
在Mavericks操作系统上使用NSOpenGLProfileVersion4_1Core会导致完全的软件降级。但在Yosemite操作系统中不会出现这个问题。

0

在使用NSOpenGLPFAOpenGLProfile和NSOpenGLProfileVersion3_2Core时(无论是在10.9还是10.10),都将实际启用OpenGL和GLSL版本4.1。我自己在这两种情况下都使用过。

NSOpenGLProfileVersion3_2Core是一个名称不准确的术语。它实际上启用了最新可用的版本,而不一定是3.2。

在您的prepareOpenGL方法中使用以下调用来检查是否正确:

NSLog(@"OpenGL version = %s", glGetString(GL_VERSION));
NSLog(@"GLSL version = %s", glGetString(GL_SHADING_LANGUAGE_VERSION));

这是相当不错的信息(NSOpenGLProfileVersion3_2Core 可以启用最新版本 3.2 或更高版本,我认为这并不是一个错误的名称),但并没有回答问题。NSOpenGLProfileVersion4_1Core 导致我的减速的原因是 Mavericks 上 NSOpenGLProfileVersion4_1Core 的问题(根据苹果开发者的说法)。 - Mike Hays
抱歉,我以为我给你提供了一个实现版本4.1而不会引起问题的替代方案。实际上,我在苹果文档中没有看到NSOpenGLProfileVersion4_1Core作为有效的配置文件选项。 - jwlaughton
NSOpenGLProfileVersion3_2Core 并不在语义上启用最新版本,它意味着与3.2兼容的GL引擎。目前,在OS X上任何驱动程序中实现的最新版本是4.1,恰好与3.2兼容。但是,如果以后苹果实现了4.2或更高版本,这些版本将不再与3.2兼容,因为a)苹果使用向前兼容的上下文,其中已弃用的功能实际上被删除,b)4.2弃用了3.2中存在的某些功能。 - Ken Thomases
对于那些对NSOpenGLProfileVersion4_1Core感到困惑的人,它虽然没有被记录在文档中,但是在10.10 SDK的头文件中,因此它是公共API。相应的CGL常量kCGLOGLPVersion_GL4_Core在10.9 SDK的头文件中也存在。 - Ken Thomases
@jwlaughton - 不用担心,感谢您抽出时间回复 - 目前我正在使用3_2常量,因为在我的机器上它能正常工作 :)@KenThomases - 知道前向兼容性真是太好了,谢谢。没错 - 当我浏览头文件并重新熟悉API时,我碰巧发现了NSOpenGLProfileVersion4_1Core - Mike Hays

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