为什么要使用外部 OpenGL 加载器函数而不是 GLAD 的内置加载器?

Why should you use an external OpenGL loader function instead of GLAD's built in loader?

我将 GLAD 与 SFML 结合使用已有一段时间,而且我一直在使用 GLAD 的内置函数加载器 gladLoadGL,它对我来说工作得很好。现在我在看 GLFW,它在他们的指南和 Khronos opengl wiki 上都说你应该使用 gladLoadGLLoader((GLADloadproc) glfwGetProcAddress) 代替。有什么特别的原因吗?

Is there any particular reason for it?

gladLoadGL 与 GLFW 等结合使用会导致在同一个程序中有两个代码部分,它们基本上做同样的事情,没有任何好处。

例如看what GLFW does on Windows(其他平台类似):

_glfw.wgl.instance = LoadLibraryA("opengl32.dll");

它会在您背后动态加载 GL 库。它为查询 OpenGL 函数指针(核心函数指针和扩展函数指针,同时使用 wglGetProcAddress 和原始 GetProcAdress)提供了抽象。

GL loader glad 生成 does the same things:

    libGL = LoadLibraryW(L"opengl32.dll");

现在有人可能会争辩说加载同一个共享库两次没什么大不了的,因为这会导致重复使用相同的内部句柄并通过引用计数来处理,但即便如此,这也是不必要的代码,它在初始化期间仍然会消耗内存和一些时间。

因此,除非您有一些非常具体的原因来说明您为什么需要 glad 的代码 - 也许以修改后的形式真正做其他事情(比如使用不同的 GL 库,而不是您的系统默认使用的 GL 库),此代码没有用例 - 不包含不需要的代码似乎是一个合理的建议。

附带说明:我经常看到项目使用 GLFW 和 GL 加载器,如 GLAD 或 GLEW linking opengl32.liblibGL.so 在 link 时间 - 这是也绝对没有必要,因为代码总是会在运行时手动加载库,并且 link 时间不应该留下任何 GL 符号,linker 无论如何都可以从 GL 库中解析出来。