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

kir*_*oma 2 opengl glfw glad

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

der*_*ass 5

有什么特别的原因吗?

使用gladLoadGL会导致同一程序中有两个代码部分,它们基本上执行相同的操作,但没有任何好处。

例如,看看GLFW 在 Windows 上的作用(在其他平台上类似):

_glfw.wgl.instance = LoadLibraryA("opengl32.dll");
Run Code Online (Sandbox Code Playgroud)

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

GL 加载器很高兴生成做同样的事情

    libGL = LoadLibraryW(L"opengl32.dll");
Run Code Online (Sandbox Code Playgroud)

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

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

附带说明:我经常看到使用 GLFW 和 GL 加载器(例如 GLAD 或 GLEW 链接)opengl32.liblibGL.so在链接时使用的项目 - 这也绝对没有必要,因为代码始终会在运行时手动加载库,并且不应该有任何 GL 符号无论如何,链接器都可以从 GL 库中解析链接时留下的内容。