【发布时间】:2013-05-07 08:56:13
【问题描述】:
我在我的引擎中添加了一个新的 GL 渲染器,它使用核心配置文件。虽然它在 Windows 和/或 nvidia 卡上运行良好,但在 OS X 上却慢了 10 倍(3 fps 而不是 30)。奇怪的是,我的兼容性配置文件渲染器运行良好。
我使用 Instruments 和 GL profiler 收集了一些痕迹:
https://www.dropbox.com/sh/311fg9wu0zrarzm/31CGvUcf2q
这表明应用程序将时间花在 glDrawRangeElements 中。 我尝试了以下方法:
- 改用 glDrawElements(无效)
- 翻转剔除(不影响速度)
- 禁用一些 GL_DYNAMIC_DRAW 缓冲区(无效)
- 绘制时在VAO后绑定索引缓冲区(无效)
- 将索引转换为 4 字节(无效)
- 使用 GL_BGRA 纹理(无效)
我没有尝试将我的顶点对齐到 16 字节边界和/或将索引转换为 4 字节,但说真的,如果这会是问题,那么为什么要执行标准允许吗?
我正在创建这样的上下文:
NSOpenGLPixelFormatAttribute attributes[] =
{
NSOpenGLPFAColorSize, 24,
NSOpenGLPFAAlphaSize, 8,
NSOpenGLPFADepthSize, 24,
NSOpenGLPFAStencilSize, 8,
NSOpenGLPFADoubleBuffer,
NSOpenGLPFAAccelerated,
NSOpenGLPFANoRecovery,
NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,
0
};
NSOpenGLPixelFormat* format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes];
NSOpenGLContext* context = [[NSOpenGLContext alloc] initWithFormat:format shareContext:nil];
[self.view setOpenGLContext:context];
[context makeCurrentContext];
尝试了以下规格:
- Radeon 6630M,OS X 10.7.5
- Radeon 6750M,OS X 10.7.5
- geforce GT 330M,OS X 10.8.3
你有什么想法我可能做错了吗?同样,它适用于兼容性配置文件(但不使用 VAO)。
更新:向 Apple 报告。
更新:Apple 并不在乎这个问题......无论如何,我创建了一个实际上很好的小型测试程序。现在我将调用堆栈与 Instruments 进行了比较,发现在使用引擎时,glDrawRangeElements 进行了两次调用:
- gleDrawArraysOrElements_ExecCore
- gleDrawArraysOrElements_Entries_Body
在测试程序中它只调用第二个。现在第一个调用执行类似于立即模式渲染(gleFlushPrimitivesTCLFunc,gleRunVertexSubmitterImmediate)的操作,因此显然会导致速度变慢。
【问题讨论】:
-
"但是说真的,如果这会是问题,那为什么标准会允许它呢?" 因为标准没有定义性能。只有功能。
-
这听起来几乎像是在回归软件。您应该对其进行分析并查看减速在哪里。另外,你能用 OpenGL Profiler 运行它并打开所有的错误断点吗?它可能会指出您遗漏的一些东西(如果它回退到软件,它会告诉您)。
-
我确实启用了错误检查,以及中断 sw 回退,但什么也没发生。顺便提一句。我附加的日志显示引擎也在每帧检查 GL 错误。正如我提到的,减速显然是在 glDrawRangeElements 中。
-
你渲染的缓冲区数据有多大?
-
既然 GL_UNSIGNED_SHORT 足够了,它不能太大,而且无论如何它都可以在 GL 2 上正常工作。我尝试了更小甚至更大的模型,但无论着色器或几何复杂性如何,它们都运行得很慢。
标签: performance macos opengl profile core