启用 OpenGL ES 扩展是否会降低性能?

Is there a performance penalty for enabling OpenGL ES extensions?

一般来说,仅在着色器中启用 OpenGL ES 扩展是否会导致性能下降?

我正在编写一些代码,将各种扩展的启用注入到所有着色器的着色器源代码中,而不管特定着色器是否需要该扩展。这可能会导致性能下降吗?从概念上讲,它似乎不太可能。

我对iOS特别感兴趣。

在着色器执行方面,简单地要求扩展没有任何效果。着色器被编译成 GPU 兼容格式,#extension(作为预处理器标记)不会对生成的输出产生任何影响。您可以在 glGetProgramBinaryOES 可用的其他 GLES 平台(例如 Android)上验证生成的输出的等效性,并将生成的着色器与没有 #extension 预处理器的着色器进行比较。

GLSL 解析器将有一些额外的工作来解析着色器。对于单个着色器来说,这不太可能是大量的额外处理时间,但这确实取决于驱动程序的着色器编译器。如果你有非常多的着色器,这个累积的额外工作可能会变得很重要。在这种情况下,当您的着色器实际上不需要时,删除 #extension 语句可能会有好处。

特别是对于 iOS,着色器编译是散列的,因此二进制文件会自动存储以用于后续的着色器编译,甚至跨应用程序会话。这意味着您只需 'pay' 应用程序第一个 运行 的解析器成本(除非您的着色器是动态的),从而减少对解析器性能的关注。这在 Android 上是不正确的,其中必须使用 glGetProgramBinaryOESglProgramBinaryOES 显式存储和加载程序二进制文件才能获得相同的行为。

就是说,需要扩展意味着您将使用它,这可能会对着色器产生很大影响,具体取决于它是哪个扩展以及您使用它做什么。 list of iOS GLES extensions 包括一些由 #extension 语句启用的内容(EXT_draw_instancedEXT_shader_texture_lodEXT_shader_framebuffer_fetch、...)。很容易想象,使用 EXT_shader_framebuffer_fetch 扩展对帧缓冲区进行采样的着色器比不这样做的等效着色器执行时间更长。