Performance OSX上的OpenGL核心配置文件
我在我的引擎中添加了一个新的GL渲染器,它使用核心配置文件。虽然它在Windows和/或nvidia卡上运行良好,但在OSX上的速度要慢10倍(每秒3帧,而不是30帧)。奇怪的是,我的兼容性配置文件渲染器运行良好 我用仪器和GL轮廓仪收集了一些痕迹: 它表明应用程序将时间花在元素上。 我试过以下方法:Performance OSX上的OpenGL核心配置文件,performance,macos,opengl,profile,core,Performance,Macos,Opengl,Profile,Core,我在我的引擎中添加了一个新的GL渲染器,它使用核心配置文件。虽然它在Windows和/或nvidia卡上运行良好,但在OSX上的速度要慢10倍(每秒3帧,而不是30帧)。奇怪的是,我的兼容性配置文件渲染器运行良好 我用仪器和GL轮廓仪收集了一些痕迹: 它表明应用程序将时间花在元素上。 我试过以下方法: 改用GLD元素(无效) 翻转剔除(不影响速度) 禁用某些GL\U动态\U绘图缓冲区(无效) 绘制时VAO后绑定索引缓冲区(无效果) 已将索引转换为4字节(无效) 使用GL_BGRA纹理(无效果
- 改用GLD元素(无效)
- 翻转剔除(不影响速度)
- 禁用某些GL\U动态\U绘图缓冲区(无效)
- 绘制时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,操作系统X 10.7.5
- radeon 6750M,OS X 10.7.5
- geforce燃气轮机330M,操作系统X 10.8.3
- GledrawArraySoreElements\u Execore
- GledrawArrayOrelements\u条目\u正文
而在测试程序中,它只调用第二个。现在,第一个调用执行类似立即模式渲染的操作(gleFlushPrimitivesTCLFunc、gleRunVertexSubmitterImmediate),因此显然导致了减速。最后,我能够重现减速。这太疯狂了。。。这显然是由于在“my_Position”属性上调用GLBindAttriblLocation造成的。现在我做了一些测试:
- 1为默认值(由GLGetAttriblLocation返回)
- 如果我把它设为零,就没有问题了
- 如果将其设置为1,渲染将变慢
- 如果我将其设置为任何较大的数字,它将再次变慢
- 用XCode打开
- 打开common/glext.h(不要被名称打扰)
- 将GLDECLUSAGE_位置常数从0修改为1
- 编译并运行=>slow
- 变回零=>很好
OSX小牛:
- 使用数组缓冲区进行实例渲染,为每个实例提供其自己的
和modelToWorld
矩阵;属性位置是通过布局而不是使用inverseNormal
glGetAttriblLocation
- 在
中保留其中一个未使用的数组缓冲区,其中声明了位置,但该属性实际上未用于着色器
代码中的任何内容glsl
glDrawerElementsInstanced
会占用大量CPU时间(在正常情况下,即使在绘制数千个实例时,此调用也会使用几乎为零的CPU)
如果gldrawlementsinstanced
中使用的几乎所有CPU时间都花费在gledrawraraysorelements\u ExecCore
中,则可以看出您遇到了这个特定问题。确保所有数组缓冲区都在着色器中被实际引用
代码将CPU时间修复回(接近)零
我怀疑这是一种情况,在
glsl
的main()中保留一个变量会使编译器混淆,从而删除对该变量的所有引用,留下对属性或统一的悬空引用。“但说真的,如果这是个问题,那么标准为什么会允许它?”因为标准没有定义性能。只有功能性。这听起来像是回到了软件上。你应该对它进行分析,看看减速在哪里。另外,您可以使用OpenGL Profiler运行它并打开所有错误断点吗?它可能会指出您缺少的东西(并会告诉您是否正在退回到软件中)。我确实启用了错误检查,并中断了软件回退,但什么也没发生。顺便说一句,我所附的日志显示引擎也在每一帧检查GL错误。正如我所提到的,glDrawRangeElements的速度明显放缓。您渲染的缓冲区数据有多大?因为GL_UNSIGNED_SHORT就足够了,所以它不可能太大,而且不管怎样,它可以与GL 2配合使用。我尝试了更小甚至更大的模型,不管着色器或几何体的复杂性如何,它们都运行缓慢。谢谢!我花了好几天的时间试图找出为什么我在2013年的MacBook Pro上买了一台50K的Tris机型,却能获得15FPS的速度。FPS跳到无穷大(需要更高分辨率的计时器:P)我建议你也向苹果报告:)显然他们也没有解决我的问题。我对非常简单的着色器也有类似的问题。感谢Deekey,尽管我没有使用实例渲染,但使用未使用的向量缓冲区确实会使向量着色器在CPU上运行。为了进一步说明这有多糟糕,使用带有未使用但绑定变量的VAO将使顶点着色器在软件中运行,即使未使用的变量被禁用。