Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance OSX上的OpenGL核心配置文件_Performance_Macos_Opengl_Profile_Core - Fatal编程技术网

Performance OSX上的OpenGL核心配置文件

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纹理(无效果

我在我的引擎中添加了一个新的GL渲染器,它使用核心配置文件。虽然它在Windows和/或nvidia卡上运行良好,但在OSX上的速度要慢10倍(每秒3帧,而不是30帧)。奇怪的是,我的兼容性配置文件渲染器运行良好

我用仪器和GL轮廓仪收集了一些痕迹:

它表明应用程序将时间花在元素上。 我试过以下方法:

  • 改用GLD元素(无效)
  • 翻转剔除(不影响速度)
  • 禁用某些GL\U动态\U绘图缓冲区(无效)
  • 绘制时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,操作系统X 10.7.5
  • radeon 6750M,OS X 10.7.5
  • geforce燃气轮机330M,操作系统X 10.8.3
你知道我会做错什么吗?同样,它可以很好地与兼容性配置文件配合使用(但不使用VAOs)

更新:向苹果公司报告

更新:苹果根本不在乎这个问题……无论如何,我创建了一个小测试程序,它实际上很好。现在,我将调用堆栈与Instruments进行了比较,发现在使用引擎时,glDrawRangeElements执行两个调用:

  • 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将使顶点着色器在软件中运行,即使未使用的变量被禁用。