2

一段时间以来,我一直在使用 GLAD 和 SFML,并且一直在使用 GLAD 的内置函数加载器,gladLoadGL它对我来说效果很好。现在我在看 GLFW,它在他们的指南和 Khronos opengl wiki 上都说你应该使用它gladLoadGLLoader((GLADloadproc) glfwGetProcAddress)。有什么特别的原因吗?

4

1 回答 1

4

有什么特别的原因吗?

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

例如,看看GLFW 在 Windows 上做了什么(在其他平台上类似):

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

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

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

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

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

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

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

于 2020-07-27T18:14:54.510 回答