为什么初始化 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 一起使用。
我正在使用 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 一起使用。