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

时间:2016-10-22 00:45:49

标签: c performance opengl glfw 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);之后会引发分段错误它不应该。

1 个答案:

答案 0 :(得分:3)

因为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一起使用。