为什么这个OpenGL应用程序在某些Mac上运行得非常慢?

时间:2017-06-19 23:40:28

标签: macos opengl graphics rust glsl

我写了一个小分形视频反馈应用。它在运行Linux或Windows 10的旧笔记本电脑上运行良好。它在我的Android手机上正常运行。它在桌面Hackintosh上运行良好。但在某些MacBook上,它的运行速度为0.02 FPS,并使用整个CPU内核(应该使用几个%)。

我假设我正在使用一些着色器功能,导致它下拉到软件渲染,但那可能是什么?着色器没有做任何非常花哨的事情;你可以see the source code here。着色器在非GLES平台上使用#version 150

程序每帧只绘制6个三角形:纹理之间有两个乒乓球,屏幕有一个副本。 CPU端的Rust代码也在该repo中。

有谁知道可能导致此问题的原因,或者我可以使用哪些工具来追踪它?

1 个答案:

答案 0 :(得分:2)

通过在创建某些像素格式属性时指定某些像素格式属性,可以强制OpenGL上下文仅使用硬件渲染器。如Technical Q&A QA1502 Ensuring hardware accelerated rendering for your OpenGL application

中所述
  

选择硬件加速渲染器而不选择软件回退的一种简单方法是选择以下像素格式属性:

     

对于CGL:

     

kCGLPFAAcceleratedkCGLPFANoRecovery

     

对于AGL:

     

AGL_ACCELERATEDAGL_NO_RECOVERY

     

对于NSOpenGL:

     

NSOpenGLPFAAcceleratedNSOpenGLPFANoRecovery

QA1502还描述了如何询问内容是否使用GPU进行顶点和片段处理。

您可以咨询Apple的OpenGL Capabilities Tables,看看您是否使用目标硬件不支持的功能。请注意,本文档包含三个表(对于10.7.5,10.8.5和10.9),每个表都有几页长。自10.9以来,macOS OpenGL硬件功能没有任何变化,或者Apple只是没有记录它们。

Apple的OpenGL for macOS开发者页面上还有一个表格链接作为Numbers电子表格。

如果您正在查看功能表,您可能会发现this document对于确定目标Mac中的哪些GPU硬件非常有用。

您可以使用OpenGL Profiler查看您的应用发布的OpenGL调用内容以及播放时间。这可能会帮助您找出问题所在。 OpenGL Profiler是Additional Tools for Xcode的一部分。

然而,在所有macOS Sierra的生命周期中,探查器已被破坏:如果您尝试连接到正在运行的应用程序,它会使您的应用程序崩溃,如果您使用探查器启动您的应用程序,它永远不会完成附加。我在WWDC 2017上与负责任的Apple工程师一起调查了这个问题,我们发现“Xcode 9 beta的附加工具”中的分析器可以在macOS Sierra 10.12.5中运行,但不能在macOS High Sierra 10.13 beta 1中运行。所以,如果你是运行macOS Sierra,使用该版本。

显然,问题在于Apple不断创建配置文件所需的权利(限制)才能正常工作,而不会发布使用这些权利签署的新的Profiler版本。我希望有一个与High Sierra一起使用的探测器版本可以通过beta 3获得(可能是beta 2,但可能不是)。