Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.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
Linux与macOS、相同硬件的OpenGL性能存在巨大差异_Linux_Macos_Performance_Opengl_Gpu - Fatal编程技术网

Linux与macOS、相同硬件的OpenGL性能存在巨大差异

Linux与macOS、相同硬件的OpenGL性能存在巨大差异,linux,macos,performance,opengl,gpu,Linux,Macos,Performance,Opengl,Gpu,我正在构建一个OpenGL应用程序。OpenGL唯一不方便的地方是它使用了一些(5个或更多)相当大(2000x2000或更大)的纹理。其余的是相当默认的现代OpenGL 3.3(FBO、VBO、IBO、VOA、着色器等)。因为这些纹理非常大,并且需要一些大于8位的位深度,所以我使用GL_R11F\u G11F\u B10F内部像素格式来减少内存(但是,将其更改为简单的格式并没有帮助(见下图)) 现在,事情是这样的:完全相同的代码,运行在Windows、Linux和macOS上(我使用SDL作为抽

我正在构建一个OpenGL应用程序。OpenGL唯一不方便的地方是它使用了一些(5个或更多)相当大(2000x2000或更大)的纹理。其余的是相当默认的现代OpenGL 3.3(FBO、VBO、IBO、VOA、着色器等)。因为这些纹理非常大,并且需要一些大于8位的位深度,所以我使用
GL_R11F\u G11F\u B10F
内部像素格式来减少内存(但是,将其更改为简单的格式并没有帮助(见下图))

现在,事情是这样的:完全相同的代码,运行在Windows、Linux和macOS上(我使用SDL作为抽象层)。Linux和macOS在同一硬件(2011年末的MacBook Pro 13)、同一编译器(
clang-O3-mavx
)上的性能差异,是巨大的。在macOS上,我的帧时间约为30ms到80ms。然而,在Linux上,它是惊人的1ms到4ms。同样,同一台笔记本电脑,只是在不同的操作系统中重新启动。将应用程序窗口缩小到约600x400,在macOS上将帧时间降低到13ms。因此,像素着色器/光栅化似乎是瓶颈(我的着色器确实非常复杂)

我必须说,我过去在macOS上的帧频比较好(大约13毫秒到20毫秒)。因此,在发现这一点后,我开始怀疑苹果可能“有辱人格”“英特尔HD graphics 3000的图形驱动程序旨在通过系统更新推动客户购买新产品。我必须说,我一直在考虑购买一台新笔记本电脑,但自从我发现这一点后,突然引起了反感

现在的问题是:你认为这里会发生什么?有缺陷的驱动程序?苹果故意让事情变慢?驱动程序中包含一个未经优化的GLSL编译器?或者应用程序中我的OpenGL代码中的一些错误做法?驱动程序对非8位纹理格式的错误支持是否常见

我只是讨厌这个应用程序在Linux中使用非常好,而在macOS中却不令人愉快。硬件可以做得更好


@BDL要求的一些测试:

  • 将每个维度的纹理大小减少4倍(因此内存减少16倍,使我们的纹理大约为500x500),不会影响帧时间
  • 使用GL_RGB8或GL_SRGB8作为内部格式不会影响帧时间
  • 减少大量着色器的复杂性确实有帮助:在片段着色器中进行大量计算时,我可以将其平均值降低到8毫秒

明天我将尝试glsl着色器优化器:
希望这会有所帮助。

由于我们无法访问您的代码,因此通常很难找到堆栈溢出问题的根源,但您可以尝试以下几点:

  • 将驱动程序更新至操作系统支持的最新版本
  • 打开图形调试器,检查缓冲区大小、纹理大小、RAM使用情况、内存使用情况等

这可能只是OSX和Linux之间需要解决的一些计时问题,您还可以使用SDL获取指向原始窗口资源的指针,并通过这种方式解决问题。

您到底使用什么方法来测量帧渲染时间?在我关于各种OpenGL实现的计时行为的实验中,Mesa/Intel HD驱动程序的计时行为最难解释

适用于MacOS X的英特尔高清图形驱动程序是一个完全不同的代码库(零源代码重叠!),由一个完全不同的开发团队(主要是苹果公司的AFAIK人员)编写

请记住,OpenGL采用异步执行模型,缓冲区交换调用的确切时间没有硬性规定。在Linux上,AMD和NVidia OpenGL几乎都有
…SwapBuffers
块,直到V-Sync(如果启用了V-Sync)但是,我发现Mesa/Intel实现将
…SwapBuffers
视为另一个排队命令,只有在命令队列已满且发出调用且最终只能在缓冲区交换后执行(如清除后缓冲区)时,才会发生真正的块

长话短说,我找到了唯一可靠的方法,通过将
glClear
调用放在
…SwapBuffers
(即清除下一次迭代中的下一帧)之后,来实际测量帧渲染到演示的时间并测量从渲染开始到异常放置的
glClear
调用之后的时间


不管怎样,纯渲染时间(没有演示部分)最好通过查询对象来衡量。

@nicolas我希望你停下来:)你应该使用Instruments和/或OpenGL Profiler来评测你的应用程序。它是否占用了大量的CPU时间?它在纹理格式转换上花费了很多时间吗?您还应该尝试对代码进行调整。您使用的
GL_R11F\u G11F\u B10F
似乎是问题的一个可能原因。您不能进一步缩小性能问题的范围吗?例如,使用较小的纹理是否有帮助?降低着色器复杂性是否有帮助?哪些OpenGL调用占用了MacOS上所有的时间?@Kenthomass:不,这显然是GPU绑定的。@BDL:很难说,因为OpenGL将命令存储在队列中。当我交换缓冲区(screen&backbuffer)时,它只是等待gpu完成,因此隐藏了需要很长时间的内容。然而,我在我的问题中添加了一些您要求的结果,“更新驱动程序”?你意识到图形驱动程序是Mac操作系统的一部分,对吗?你能详细说明一下“修复时间问题”吗?你说的是什么时间问题?@MartijnCourteaux你是手动设置帧限制还是应用程序正在尽可能快地运行?因为你问了,我尝试切换所有组合:带/不带vsync,带/不带手动睡眠限制为60fps。无任何影响,帧时间在36毫秒到60毫秒之间。但是你应该注意到这个应用程序