[英]Is there a performance penalty for enabling OpenGL ES extensions?
通常,仅通过在着色器中启用OpenGL ES扩展是否会降低性能?
我正在研究一些代码,这些代码将对所有着色器的各种扩展的启用注入到着色器源代码中,而不管特定的着色器是否需要该扩展。 这可能会影响性能吗? 从概念上讲,似乎不太可能。
我对iOS特别感兴趣。
在着色器执行方面,仅要求扩展就没有任何效果。 着色器被编译为与GPU兼容的格式,并且#extension
(作为预处理器令牌)对生成的输出没有任何影响。 可以验证在其他GLES平台所产生的输出(例如,Android的),其中的等价glGetProgramBinaryOES
是可用的,并且没有所述比较与所生成的着色器#extension
预处理器。
GLSL解析器将进行一些其他工作来解析着色器。 对于单个着色器来说,这不太可能会占用大量额外的处理时间,但这确实取决于驱动程序的着色器编译器。 如果您的着色器数量过多,则这种累积的额外工作可能会变得很重要。 在这种情况下,当着色器实际上不需要#extension
语句时,删除它们可能会有好处。
专门针对iOS,对着色器编译进行哈希处理,从而即使在应用程序会话之间,也将自动存储二进制文件,以供着色器的后续编译使用。 这意味着您仅在应用程序第一次运行时“支付”解析器的成本(除非着色器是动态的),这使得解析器的性能不再是问题。 在Android上并非如此,在Android上,必须使用glGetProgramBinaryOES
和glProgramBinaryOES
显式地存储和加载程序二进制文件才能获得相同的行为。
就是说,需要扩展名意味着您将使用它,这可能会对着色器产生很大影响,具体取决于它是哪个扩展名以及您对其进行的操作。 iOS GLES扩展列表包括#extension
语句启用的一些扩展 ( EXT_draw_instanced
, EXT_shader_texture_lod
, EXT_shader_framebuffer_fetch
等。)。 不难想象,使用EXT_shader_framebuffer_fetch
扩展名对帧缓冲区进行采样的着色器比不使用它的等效着色器需要更长的执行时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.