iOS 12 在 iPhone X 上是否在 Metal 之上渲染 OpenGL ES?有什么办法可以避免吗?

Is iOS 12 on the iPhone X rendering OpenGL ES on top of Metal? And is there any way to avoid it?

所以我遇到了一个奇怪的问题。我正在移植一个使用 OpenGL ES 的 modern source port of an old game engine to iOS and tvOS. It was written using OpenGL and I found a fork 并且我已经能够将两者结合到现在它实际上在 iOS 和 tvOS 设备上成功 运行 的地方。

这是奇怪的部分 - 部分游戏无法在我的 iPhone X 上正确呈现,但它们在我的 iPad Air 2 和 Apple TV(第 4 代)上可以正确呈现。

我在输出 window 的一连串消息中注意到引擎输出渲染器信息的地方,在 iPhone X 上它说

OpenGL version: OpenGL ES 2.0 Metal 58.4

然而,比如说 iPad Air 2 它说

OpenGL version: OpenGL ES 2.0 A8X GPU - 130.1

"OpenGL ES Metal" 对我来说听起来像 "Jumbo Shrimp",因为它们显然不是一回事。如果让我猜的话,我会说在 iPhone X 上,OpenGL ES 驱动程序 运行 在某种 Metal 转换层之上,这可能是 Apple 的长期计划在 OpenGL ES 弃用之后,有点面向未来。

但无论出于何种原因,它正在破坏我的游戏引擎,尽管我很擅长让代码协同工作,但我对图形编码的了解还不够,甚至不知道从哪里寻找改变的东西才能工作。

显然,正确的答案是解决导致问题的任何问题,但作为短期解决方案,我很好奇是否有任何方法可以让 iOS 上的游戏变为 not 在 Metal 之上使用 OpenGL ES? (如果这确实是正在发生的事情)


因此,就像 Brad Larson 在下面所说的那样,答案是:是的,OpenGL ES 运行在 Metal 之上,不,这是不可避免的。但是,为了将来参考,如果其他人 运行 正在解决这个问题,我在另一个 SO 答案的帮助下解决了真正的潜在问题:

基本上着色器的浮点精度需要从lowpmediump升级到highp

是的,在最近的 iOS 版本中,OpenGL ES 实际上是 Metal 的接口(因为我相信 10,如果我没记错的话)。

来自Roblox Metal retrospective

It is also worth noting that there is no GL driver on iOS 10 on the newest iPhones, apparently. GL is implemented on top of Metal, which means using OpenGL is only really saving you a bit of development effort – not that much, considering that the promise of “write once, run anywhere” that OpenGL has does not really work out on mobile.

您可以通过在现代 iOS 版本上分析 OpenGL ES 代码来自行验证:

除上述之外,您还会看到 Metal-specific 操作,如 -[MTLIOAccelCommandQueue submitCommandBuffers:count:] 出现在 OpenGL ES 应用程序的分析中。

据我所知,没有办法规避这一点,现代 iOS 版本的渲染就是这样构建的。也就是说,我还没有看到这会改变我的 OpenGL ES 代码的行为。我已经看到不同的 iOS GPU 由于其硬件而产生略有不同的渲染行为,因此您可能遇到了 device-specific.

检查着色器中涉及精度限定符、Z-fighting、division-by-zero 等的常见问题,看看其中是否有一个正在扰乱您的渲染。这些都是我看到新一代设备扰乱我的渲染的地方。