一段时间以来,我一直在使用 GLAD 和 SFML,并且一直在使用 GLAD 的内置函数加载器,gladLoadGL
它对我来说效果很好。现在我在看 GLFW,它在他们的指南和 Khronos opengl wiki 上都说你应该使用它gladLoadGLLoader((GLADloadproc) glfwGetProcAddress)
。有什么特别的原因吗?
1 回答
有什么特别的原因吗?
与例如 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.lib
或libGL.so
在链接时)的项目 - 这也是绝对没有必要的,因为代码将始终在运行时手动加载库,并且不应该有任何 GL 符号在链接时留下,链接器无论如何都可以从 GL 库中解析。