使用较新版本而不是扩展时的性能提升?
Performance gain when using newer Versions over extensions?
对于我的应用程序,我需要一个渲染器。渲染器使用 OpenGL 3.3 核心配置文件作为基础。在较新的 OpenGL 版本中,有一些简洁的功能,也可以通过扩展获得。如果可用,我想使用基于最新 OpenGL 版本的更新功能。由于测试可用版本和调整加载程序是一团糟,我决定保留核心 3.3 并在可用的地方使用扩展(因为这是扩展,对吧?)。
扩展是否与更新的 OpenGL 版本中的相同功能一样快?
我们就拿GL_ARB_direct_state_access
-extension. It's available in core since 4.5 via Direct State Access吧。后者比前者快吗? IE。新版本中实现的功能是否比扩展更快?或者驱动程序 link 仍然具有相同的功能?
E:这不是关于软件设计的问题,而是关于如何处理扩展(主要是?)和性能的问题。
Are Extensions as fast as the same funcionality in newer OpenGL
versions
扩展是功能的预览。当新版本到来时,许多(大多数?)扩展都包含在标准中,因此性能将相同。
您应该查看您的目标平台。
当我 运行 OpenGL Extensions Viewer 时,它告诉我我的 HD3000 支持所有功能高达 3.1,70% 的 3.2 / 3.3 和 21% 的 4.0。
因此,您可以提前检查您需要的功能是否已在您的目标平台上使用您要使用的硬件和驱动程序实现。最新的硬件将支持 4.4 / 4.5,因为它已经存在多年。这取决于您对向后兼容性的重视程度。
当我查看 Intel 图形时,Skylake 及更高版本支持 4.4,Skylake 自 08/2015 以来就存在。所有 AMD/NVidia 硬件也将支持 4.4 / 4.5。请注意,支持级别可能介于 OS 和驱动程序版本之间。
实际上,OpenGL API spec XML description 拥有 alias
的 属性。别名另一个 GL 函数基本上在句法和语义上与其别名的函数相同 - 当扩展函数提升为核心功能并更改其名称时,此功能被大量使用。
有 GL Loaders 实际使用该信息。我知道的两个例子是:
- libepoxy
- glad2 (glad2 is current in-development branch of the glad loader generator - but I'm using it since 2 years without any issue). You'll have to explicitely enable the aliasing feature. There is also a web service which lets you generate the needed files (note the "aliasing" button on the bottom). Also have a look at the GLAD documentation.
有了这样的加载器,您就不必关心某个特定功能是来自扩展还是来自 GL 核心功能,只要它们以某种方式可用,您就可以使用它们。
另请注意,对于较新的扩展,OpenGL ARB 更经常地在函数和枚举名称上不带 ARB
后缀的情况下创建 ARB 扩展,这意味着它在任何情况下都描述完全相同的实体。这基本上是针对 在 功能被纳入核心标准后创建的扩展。他们只是为其创建一个扩展,以便可能无法满足新标准版本的某些其他要求的供应商仍然可以提供孤立的功能。
第一个例子是 GL_ARB_sync
扩展,它本身与问题 #13 中的这个事实相关:
13) Why don't the entry points/enums have ARB
appended?
This functionality is going directly into the OpenGL 3.2 core
and also being defined as an extension for older > platforms at
the same time, so it does not use ARB suffixes, like other such
new features going directly into the GL core.
您写道:
Let's take the GL_ARB_direct_state_access
-extension. It's available in core since 4.5 via Direct State Access. Is the latter faster than the former? I.e. are the functions implemented in newer versions faster than extensions? Or do driver link to the same function anyway?
GL_ARB_direct_state_access
与 GL_ARB_sync
属于同一类别。 GL 函数由名称标识,具有相同名称的两个实体意味着它们引用了非常相同 的东西。 (您不能在库中导出两个具有相同名称的不同函数,并且 *glGetProcAddress
也仅将名称字符串作为输入,因此如果有多个函数则无法决定您想要哪个版本)。
但是,如何处理这种情况仍然取决于您的 GL 加载机制,因为它可能不会尝试加载您获得的 GL 版本未暗示的功能。 glad2 例如,如果您选择它来生成 >= 4.5 加载程序或支持 GL_ARB_direct_state_access
扩展,它就会起作用。
Since it's a mess to test for available versions and adjust the loader, [...]
嗯。这将在很大程度上取决于您使用的装载机。正如我所展示的,已经有一些选项基本上可以正常工作,不仅在函数名称完全相同的情况下,而且在函数别名的情况下也是如此。
对于我的应用程序,我需要一个渲染器。渲染器使用 OpenGL 3.3 核心配置文件作为基础。在较新的 OpenGL 版本中,有一些简洁的功能,也可以通过扩展获得。如果可用,我想使用基于最新 OpenGL 版本的更新功能。由于测试可用版本和调整加载程序是一团糟,我决定保留核心 3.3 并在可用的地方使用扩展(因为这是扩展,对吧?)。
扩展是否与更新的 OpenGL 版本中的相同功能一样快?
我们就拿GL_ARB_direct_state_access
-extension. It's available in core since 4.5 via Direct State Access吧。后者比前者快吗? IE。新版本中实现的功能是否比扩展更快?或者驱动程序 link 仍然具有相同的功能?
E:这不是关于软件设计的问题,而是关于如何处理扩展(主要是?)和性能的问题。
Are Extensions as fast as the same funcionality in newer OpenGL versions
扩展是功能的预览。当新版本到来时,许多(大多数?)扩展都包含在标准中,因此性能将相同。
您应该查看您的目标平台。 当我 运行 OpenGL Extensions Viewer 时,它告诉我我的 HD3000 支持所有功能高达 3.1,70% 的 3.2 / 3.3 和 21% 的 4.0。 因此,您可以提前检查您需要的功能是否已在您的目标平台上使用您要使用的硬件和驱动程序实现。最新的硬件将支持 4.4 / 4.5,因为它已经存在多年。这取决于您对向后兼容性的重视程度。
当我查看 Intel 图形时,Skylake 及更高版本支持 4.4,Skylake 自 08/2015 以来就存在。所有 AMD/NVidia 硬件也将支持 4.4 / 4.5。请注意,支持级别可能介于 OS 和驱动程序版本之间。
实际上,OpenGL API spec XML description 拥有 alias
的 属性。别名另一个 GL 函数基本上在句法和语义上与其别名的函数相同 - 当扩展函数提升为核心功能并更改其名称时,此功能被大量使用。
有 GL Loaders 实际使用该信息。我知道的两个例子是:
- libepoxy
- glad2 (glad2 is current in-development branch of the glad loader generator - but I'm using it since 2 years without any issue). You'll have to explicitely enable the aliasing feature. There is also a web service which lets you generate the needed files (note the "aliasing" button on the bottom). Also have a look at the GLAD documentation.
有了这样的加载器,您就不必关心某个特定功能是来自扩展还是来自 GL 核心功能,只要它们以某种方式可用,您就可以使用它们。
另请注意,对于较新的扩展,OpenGL ARB 更经常地在函数和枚举名称上不带 ARB
后缀的情况下创建 ARB 扩展,这意味着它在任何情况下都描述完全相同的实体。这基本上是针对 在 功能被纳入核心标准后创建的扩展。他们只是为其创建一个扩展,以便可能无法满足新标准版本的某些其他要求的供应商仍然可以提供孤立的功能。
第一个例子是 GL_ARB_sync
扩展,它本身与问题 #13 中的这个事实相关:
13) Why don't the entry points/enums have
ARB
appended?This functionality is going directly into the OpenGL 3.2 core and also being defined as an extension for older > platforms at the same time, so it does not use ARB suffixes, like other such new features going directly into the GL core.
您写道:
Let's take the
GL_ARB_direct_state_access
-extension. It's available in core since 4.5 via Direct State Access. Is the latter faster than the former? I.e. are the functions implemented in newer versions faster than extensions? Or do driver link to the same function anyway?
GL_ARB_direct_state_access
与 GL_ARB_sync
属于同一类别。 GL 函数由名称标识,具有相同名称的两个实体意味着它们引用了非常相同 的东西。 (您不能在库中导出两个具有相同名称的不同函数,并且 *glGetProcAddress
也仅将名称字符串作为输入,因此如果有多个函数则无法决定您想要哪个版本)。
但是,如何处理这种情况仍然取决于您的 GL 加载机制,因为它可能不会尝试加载您获得的 GL 版本未暗示的功能。 glad2 例如,如果您选择它来生成 >= 4.5 加载程序或支持 GL_ARB_direct_state_access
扩展,它就会起作用。
Since it's a mess to test for available versions and adjust the loader, [...]
嗯。这将在很大程度上取决于您使用的装载机。正如我所展示的,已经有一些选项基本上可以正常工作,不仅在函数名称完全相同的情况下,而且在函数别名的情况下也是如此。