使用较新版本而不是扩展程序时的性能提升?

时间:2018-02-11 00:00:43

标签: opengl opengl-3 opengl-4

对于我的应用程序,我需要一个渲染器。渲染器使用OpenGL 3.3核心配置文件作为基本配置文件。在较新的OpenGL版本中,有一些简洁的功能,也可以通过扩展。如果可用,我想使用基于最新OpenGL版本的更新功能。由于测试可用版本并调整加载器是一团糟,我决定继续使用核心3.3并使用可用的扩展(因为这是扩展,对吧?)。

Extensions在新的OpenGL版本中是否与同样的功能一样快?

我们来看GL_ARB_direct_state_access - 扩展名。它自4.5以来通过Direct State Access以核心形式提供。后者比前者快吗?即新版本中实现的功能是否比扩展更快?或者司机链接到同一个功能呢?

E:这不是关于软件设计的问题,而是关于如何处理扩展(主要是?)和性能的问题。

2 个答案:

答案 0 :(得分:1)

实际上,OpenGL API spec XML description具有alias的漂亮属性。别名别名的GL函数在语法和语义上基本上与别名别名相同-当扩展功能提升为核心功能并更改其名称时,此功能会大量使用。

那里有GL Loaders个实际使用该信息的地方。我知道的两个例子是:

  • libepoxy
  • glad2(glad2是高兴的装载程序生成器的当前正在开发中的分支-但我使用它已经有两年了,没有任何问题)。您必须明确启用别名功能。还有一个web service,可让您生成所需的文件(请注意底部的“别名”按钮)。还可以看看GLAD documentation

有了这样的加载器,您不必担心某个特定功能是来自扩展还是来自GL核心功能,只要可以使用它们就可以使用它们。

还请注意,使用较新的扩展名,OpenGL ARB通常会在没有函数和枚举名称后缀ARB的情况下创建ARB扩展名,这意味着在任何情况下它都描述了完全相同的实体。基本上,这些扩展是在将功能合并到核心标准后 创建的。他们只是为其创建扩展,以便可能无法满足新标准版本其他要求的供应商仍然可以提供隔离的功能。

第一个示例是GL_ARB_sync扩展名,它本身与问题#13相关:

  

13)为什么没有在入口点/枚举后面附加ARB

     

此功能直接进入OpenGL 3.2内核          并且在以下位置被定义为旧版>平台的扩展          同时使用,因此它不使用ARB后缀,例如其他          新功能直接进入GL核心。

您写了:

  

让我们使用GL_ARB_direct_state_access扩展名。从4.5开始,就可以通过直接状态访问在内核中使用它。后者比前者快吗?即在新版本中实现的功能比扩展更快吗?还是驱动程序链接到同一功能?

GL_ARB_direct_state_accessGL_ARB_sync属于同一类别。 GL函数由名称标识,并且两个具有相同名称的实体表示它们引用的是“非常相同”的东西。 (您不能在库中导出两个具有相同名称的不同函数,并且*glGetProcAddress也仅将名称字符串作为输入,因此,如果存在多个名称,则无法确定您想要的版本)。

但是,这仍然取决于您的GL加载机制,这种情况如何处理,因为它可能不会尝试加载您所获得的GL版本未暗示的功能。例如,如果您选择glad2来生成> = 4.5加载程序或支持GL_ARB_direct_state_access扩展名,它就可以工作。

  

由于测试可用版本并调整加载程序很麻烦,[...]

好吧。这将在很大程度上取决于您使用的装载程序。如我所展示的,已经存在一些基本上可以实现ut的选项,不仅在绝对相同的函数名称的情况下,而且对于别名函数也是如此。

答案 1 :(得分:0)

  

在新版OpenGL中扩展的速度是否与相同功能相同?   版本

扩展名是该功能的预览。新版本到来时,标准中将包含许多(大多数?)扩展,因此性能将是平等的。

您应该查看目标平台。 当我运行OpenGL Extensions Viewer时,它表明我的HD3000支持的所有功能高达3.1、3.2 / 3.3的70%和4.0的21%。 因此,您可以预先检查您所需的功能是否已在您要使用的硬件和驱动程序的目标平台上实现。最新的硬件将支持4.4 / 4.5,因为它已经存在多年了。由您决定您对向后兼容性的重视程度。

当我查看自Skylake以来的英特尔显卡以及其不支持4.4的显卡时,Skylake即将于08/2015发布。所有AMD / NVidia硬件也将支持4.4 / 4.5。请注意,支持级别可能介于操作系统版本和驱动程序版本之间。