【问题标题】:Why is initializing gl3w so much faster than initializing GLEW?为什么初始化 gl3w 比初始化 GLEW 快得多?
【发布时间】:2016-10-22 00:45:48
【问题描述】:

我正在使用 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 倍! p>

#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); 之后会引发分段错误,而它不应该。

【问题讨论】:

  • 但是,但是,但是!我认为喷气发动机比活塞发动机快。为什么启动和停止我的喷气发动机所用的时间比启动和停止汽车发动机的时间要长?我以为喷气发动机旋转得更快?这基本上就是你问的问题。基本上,启动/停机时间与运行期间达到的速度无关。我看不出这个问题的真正目的是什么。
  • @enhzflep 你是说gl3w 使所有OpenGL 函数调用变慢? AFAIK没有区别!或者你是说 GLEW 比gl3w 做得更多?我不明白你的喷气发动机和活塞发动机的类比。
  • 没有。我是说你报告说 GL3W 比 GLEW 慢,但你没有尝试进行任何支持这种说法的测试。您只需测量启动时间。类比的目的是证明定时启动时间作为确定运行速度的手段是荒谬的。 ;)
  • 这就是我所要求的。为什么初始化 gl3w 比初始化 GLEW 花费的时间更少。也许我只是措辞不正确。编辑:固定标题。

标签: c performance opengl glfw glew


【解决方案1】:

因为 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 中使用这个开关。

【讨论】:

  • 哇,这么新!难怪它没有包含在我的 Ubuntu 存储库中。由于无论如何我都在使用核心上下文,我认为 gl3w 对我来说就足够了。谢谢你满足我的好奇心!
猜你喜欢
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 2020-02-22
  • 2020-03-12
  • 2012-02-13
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多