gpt4 book ai didi

opengl - 为什么OpenGL函数在运行时加载而不是动态链接?

转载 作者:行者123 更新时间:2023-12-03 13:16:57 31 4
gpt4 key购买 nike

OpenGL API 的用户通常使用 GLEW 之类的库,或者乐于在运行时加载 OpenGL 函数。为什么动态加载是首选的链接方式?

静态链接显然不是一种选择,因为使用 OpenGL 的程序通常由作者编译并分发给具有不同 OpenGL 库的特定图形卡的用户。

剩下的是动态链接和动态加载。似乎动态链接可以工作,因为我们知道我们要访问的所有函数的名称。

动态链接是否可行?如果不是,为什么?如果是,为什么首选动态加载?

最佳答案

你想要的都是可能的。您可以制作一个带有静态接口(interface)的 DLL/SO 加载器,它将从幕后的实现中加载函数指针。它将根据当前的上下文将函数调用传递给实现。事实上,这就是现代 Linux 发行版的本质。

这也是 WGL 在 Windows 上的工作方式……至少 OpenGL 版本 1.1。

它不是“首选”的原因是因为它需要努力。必须有人创建和维护这个位于应用程序和驱动程序之间的中间库。每当出现新的扩展时,都必须更新库。每当新版本出现时,都必须更新库。然后你必须确保链接到这个库的正确版本。

这个额外的依赖在 Linux 上运行良好,因为它一直是最新的。 Windows 上的 OpenGL32.dll 但不是。 WinNT 采用 OpenGL 有一段时间了,但微软也离开并 创建 为 Win9x 购买了他们自己的图形 API。因此,他们从未为更高版本的 OpenGL 或新扩展更新 OpenGL32.dll。如果他们愿意不向后兼容,我想他们会完全从他们的操作系统中放弃 OpenGL32.dll。

由于您需要一个运行时加载程序才能在 Windows 中工作,因此使用相同的运行时加载程序让所有平台都工作会更容易(尽管显然使用不同的函数来获取函数指针)。虽然您可以创建您正在谈论的那种 DLL,但它只是多了一个 OpenGL 加载库,多了一个您必须维护的依赖项。如果没有 Linux/MESA 带来的集中化,那么麻烦就没有意义了。


I was thinking that an application could be dynamically linked directly to the driver itself without an intermediate library

你可以这样做。但是,您将使用静态导入库链接到该特定驱动程序的库。这意味着如果您链接到 NVIDIA 的实现,您的应用程序将无法在 AMD 的实现上运行。

而且您不能静态链接到两个 DLL 的导入库。原因是如果一个静态导入库无法加载,您的应用程序终止。因此,除非您的计算机上同时拥有 AMD 和 NVIDIA 的实现,否则您将无法在其中任何一个上运行。

还有:

since even though the driver library can't be available at compile time, we still know the OpenGL function names

假设他们的驱动程序直接导出这些名称。这很难保证。

毕竟WGL/GLX接口(interface)是使用wgl/glXGetProcAddress来获取函数指针的。如果WGL/GLX与驱动的接口(interface)只是简单的将字符串传递给驱动的函数,那么驱动就不需要直接导出任何函数。它通过单个入口点公开其 API,强制加载运行时函数指针而不是允许静态链接。

My understanding is that OpenGL loading libraries LoadLibrary/dlopen from dll/dylib/so library files which are themselves graphics card drivers and those driver libraries have symbol tables with OpenGL functions. Which parts of that are wrong?

所有部分都是错误的。您链接到基本接口(interface) API(如 WGL 或 GLX)。加载库使用该接口(interface)来加载函数指针。接口(interface) API 如何将函数指针加载到驱动程序 DLL 是一个特定于平台的问题。在 Windows 上,wglGetProcAddress 调用驱动程序中的函数,传递函数的字符串名称并取回函数指针。

在 Linux 上,GLX 倾向于在内部制造函数,使用后期绑定(bind)技术稍后加载实际的驱动程序函数。也就是说,您可以使用一些虚假名称调用 glXGetProcAddress,它会返回一个函数指针 shim,当调用该函数指针时,将从驱动程序加载当前上下文的函数。

关于opengl - 为什么OpenGL函数在运行时加载而不是动态链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47445643/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com