Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么初始化gl3w比初始化GLEW快得多?_C_Performance_Opengl_Glfw_Glew - Fatal编程技术网

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

C 为什么初始化gl3w比初始化GLEW快得多?,c,performance,opengl,glfw,glew,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设置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;
}
#包括“gl3w.h”
#包括
内部主(空)
{
如果(!glfwInit())返回1;
glfwWindowHint(GLFW_上下文_版本_专业,3);
glfwWindowHint(GLFW_上下文_版本_小调,3);
glfwWindowHint(GLFW_OPENGL_配置文件、GLFW_OPENGL_核心配置文件);
GLFWwindow*win=glfwCreateWindow(960540,“标题”,空,空);
如果(!win)返回2;
glfwMakeContextCurrent(win);
for(int i=0;i<100;++i)if(gl3wInit())返回3;
如果(!gl3wIsSupported(3,3))返回4;
GLFW窗口(win);
glfwTerminate();
返回0;
}
初始化GLEW100次大约需要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;
}
#包括
#包括
内部主(空)
{
如果(!glfwInit())返回1;
glfwWindowHint(GLFW_上下文_版本_专业,3);
glfwWindowHint(GLFW_上下文_版本_小调,3);
glfwWindowHint(GLFW_OPENGL_配置文件、GLFW_OPENGL_核心配置文件);
GLFWwindow*win=glfwCreateWindow(960540,“标题”,空,空);
如果(!win)返回2;
glfwMakeContextCurrent(win);
glewExperimental=GL_TRUE;
for(int i=0;i<100;++i)if(glewInit())返回3;
GLFW窗口(win);
glfwTerminate();
返回0;
}
我对此感到非常惊讶,因为这两个库都是为满足相同的目的而设计的。有人能解释一下区别是什么吗


顺便说一下,省略
glewExperimental=GL\u TRUE将时间缩短为0.3秒,但由于
glBindVertexArray(0),因此GLEW未正确初始化稍后抛出一个分段错误,而它本不应该抛出。

因为GLEW比GL3W做更多的工作

GL3W仅包含OpenGL标题中的函数
glcorearb.h
。它包含OpenGL4.5中的函数,以及许多ARB扩展。这意味着它不包括其他扩展函数或非核心概要文件

GLEW为您提供OpenGL注册表中的所有函数。此外,还有:

glewExperimental = GL_TRUE;
通常,GLEW会在尝试加载某个特定扩展的函数之前检查该扩展是否受支持。通过使用它,你告诉GLEW不要做那个检查。相反,它将尝试加载每个函数,而不管是否指定了扩展名

您可能被告知必须使用此开关。那不再是真的了

请参见,OpenGL 3.0更改了在OpenGL中测试扩展的方式。因此,旧方法被弃用,因此在3.1和core profile 3.2+中被删除

然而,GLEW继续使用旧的扩展测试功能。因此,如果您想在核心概要文件中使用GLEW,就必须使用该开关


8年后,GLEW 2.0终于解决了这个问题。。。很久以后,大约六个更好的解决了这个问题多次。但无论如何,关键是你不应该在GLEW 2.0中使用这个开关。

但是,但是,但是!我认为喷气式发动机比活塞式发动机快。为什么启动和停止我的喷气式发动机比启动和停止我的汽车发动机需要更长的时间?我以为喷气发动机转得更快?这基本上就是你问的问题。基本上,启动/运行时间与运行期间达到的速度无关。我看不出这个问题的真正目的是什么。@enhzflep你是说
gl3w
会使所有OpenGL函数调用变慢吗?好吧,没什么区别!或者你是说GLEW比gl3w做的更多?我不明白你的喷气发动机和活塞发动机的类比。不。我的意思是,您报告GL3W比GLEW慢,但您没有尝试进行任何支持这种说法的测试。您只需测量启动时间。类比的目的是为了证明计时启动时间作为确定运行速度的手段的荒谬性这就是我的要求。为什么初始化gl3w比初始化GLEW花费的时间更少。也许我只是用词不对。编辑:修正了标题。哇,太新了!难怪它没有包含在我的Ubuntu存储库中。既然我使用的是核心上下文,我想gl3w对我来说就足够了。谢谢你满足了我的好奇心!