我使用Instruments和GL分析工具收集了一些跟踪数据:
https://www.dropbox.com/sh/311fg9wu0zrarzm/31CGvUcf2q
它显示应用程序在glDrawRangeElements中花费了时间。 我尝试了以下几件事情:- 使用glDrawElements代替(无效)
- 翻转剔除(速度没有影响)
- 禁用一些GL_DYNAMIC_DRAW缓冲区(无效)
- 绑定索引缓冲区到VAO后进行绘制(无效)
- 将索引转换为4字节(无效)
- 使用GL_BGRA纹理(无效)
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
你有任何想法我可能做错了什么吗?再次强调,使用兼容性配置文件可以正常工作(不使用VAOs)。
更新:已向苹果报告。
更新:苹果对此问题不屑一顾...无论如何,我创建了一个小的测试程序,实际上很好。现在我用Instruments比较了调用堆栈,并发现使用引擎时,glDrawRangeElements会进行两个调用:
- gleDrawArraysOrElements_ExecCore
- gleDrawArraysOrElements_Entries_Body
而在测试程序中,它只调用第二个。现在第一个调用会执行类似于即时模式渲染的操作(gleFlushPrimitivesTCLFunc,gleRunVertexSubmitterImmediate),因此明显会导致减速。