为什么初始化 gl3w 比初始化 GLEW 快得多?

Why is initializing gl3w so much faster than initializing GLEW?

我正在使用 GLFW 设置 OpenGL 上下文,然后通过多次初始化每个库来测试每个库的速度,同时打开所有优化标志。

在我的机器上,gl3w 可以在大约 0.5 秒内初始化 100 次:

#include "gl3w.h"
#include <GLFW/glfw3.h>

int main(void)
{
    if (!glfwInit()) return 1;
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    GLFWwindow *win = glfwCreateWindow(960, 540, "Title", NULL, NULL);
    if (!win) return 2;
    glfwMakeContextCurrent(win);

    for (int i = 0; i < 100; ++i) if (gl3wInit()) return 3;
    if (!gl3wIsSupported(3, 3)) return 4;

    glfwDestroyWindow(win);
    glfwTerminate();

    return 0;
}

虽然初始化 GLEW 100 次大约需要 2.5 秒,大约 5倍慢!

#include <GL/glew.h>
#include <GLFW/glfw3.h>

int main(void)
{
    if (!glfwInit()) return 1;
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    GLFWwindow *win = glfwCreateWindow(960, 540, "Title", NULL, NULL);
    if (!win) return 2;
    glfwMakeContextCurrent(win);

    glewExperimental = GL_TRUE;
    for (int i = 0; i < 100; ++i) if (glewInit()) return 3;

    glfwDestroyWindow(win);
    glfwTerminate();

    return 0;
}

我对此感到非常惊讶,因为这两个库都是为满足相同的目的而设计的。有人可以解释一下有什么区别吗?

顺便说一下,省略 glewExperimental = GL_TRUE; 将时间缩短到 0.3 秒,但是 GLEW 没有正确初始化,因为 glBindVertexArray(0); 之后会抛出一个分段错误,但它不应该。

因为 GLEW 做的工作比 GL3W 多。

GL3W 由 OpenGL 头文件glcorearb.h 中的函数组成。这包含 OpenGL 4.5 中的功能,以及许多 ARB 扩展。这意味着它不包括其他扩展功能或非核心配置文件内容。

GLEW 为您提供 OpenGL 注册表中的所有功能。另外,还有这个:

glewExperimental = GL_TRUE;

通常,GLEW 会在尝试加载其功能之前检查是否支持特定扩展。通过使用它,您告诉 GLEW 不要进行该检查。相反,无论是否指定扩展名,它都会尝试加载每个函数。

您可能被告知您必须使用此开关。现在不是这样了。

看,OpenGL 3.0 改变了您在 OpenGL 中测试扩展的方式。因此,旧方法已被弃用,因此在 3.1 和核心配置文件 3.2+ 中被删除。

但是,GLEW 继续使用旧的扩展测试功能。因此,如果您想将 GLEW 与核心配置文件一起使用,则必须使用该开关。

GLEW 2.0,八年后,终于解决了这个问题......很久之后,大约有六个更好的 OpenGL loading libraries 多次解决了这个问题。但无论如何,关键是您不应该将此开关与 GLEW 2.0 一起使用。