C++ 在Windows上的Opengl中测量运行时间?

C++ 在Windows上的Opengl中测量运行时间?,c++,windows,visual-studio,opengl,visual-studio-2015,C++,Windows,Visual Studio,Opengl,Visual Studio 2015,我想测量opengl中渲染函数的运行时间。 我在Visual studio 2015上使用Nuget插件。 在下面的代码中,我想测量时间来画一个三角形。 然而,它在queryID的glGenQueries2崩溃 请在下面或上面查看我的代码 此错误表明functionpointer glGenQueries是空指针。这通常发生在windows下无法加载特定扩展,或者请求/支持的OpenGL版本不够高的情况下 要使用的函数从OpenGL 1.5开始就可用,因此必须确保上下文至少具有此版本。使用fre

我想测量opengl中渲染函数的运行时间。 我在Visual studio 2015上使用Nuget插件。 在下面的代码中,我想测量时间来画一个三角形。 然而,它在queryID的glGenQueries2崩溃 请在下面或上面查看我的代码


此错误表明functionpointer glGenQueries是空指针。这通常发生在windows下无法加载特定扩展,或者请求/支持的OpenGL版本不够高的情况下

要使用的函数从OpenGL 1.5开始就可用,因此必须确保上下文至少具有此版本。使用freeglut,可以使用glutInitContextVersion和glutInitContextFlags请求特定版本和配置文件。还要注意的是,在windows下,OpenGL>1.1的所有函数都必须手动加载,或者由上下文管理库(如)加载

编辑:直接在CreateWindow之前添加以下代码:

这是一扇窗户


有关glew的构建和链接的详细信息,请访问他们的网站。

首先在调试器中运行以捕获正在运行的崩溃。然后你就能在你的代码中找到它发生的地方,你可以告诉我们。亲爱的@JoachimPileborg,谢谢你的评论。在上面的屏幕截图中,我运行了调试器,它是glGenQueries2,queryID。这就是我所知道的。似乎glGenQueries没有加载。您需要OpenGL 1.5上下文。检查函数的地址,使用GLEW或其他加载程序并尝试加载它。亲爱的@BDL,感谢您的回答。你能补充一下细节吗?代码示例。我是opengl新手。您想要使用的函数从opengl 1.5开始就可以使用。请注意,这本质上意味着,给定任何合理的驱动程序,您永远不会得到不支持此函数的opengl上下文。核心/兼容性配置文件仅在OpenGL-3.3中引入,并要求
#include <GL\glew.h>
#include <GL\freeglut.h>
#include <iostream>

void display(void)
{
    GLuint64 startTime, stopTime;
    unsigned int queryID[2];

    // generate two queries
    glGenQueries(2, queryID);
        // issue the first query
        // Records the time only after all previous 
        // commands have been completed
        glQueryCounter(queryID[0], GL_TIMESTAMP);

    // call a sequence of OpenGL commands
        glClear(GL_COLOR_BUFFER_BIT);
        glColor3f(1.0f, 1.0f, 1.0f); //Defining color (white)
        glBegin(GL_LINE_LOOP);
        glVertex3f(5.0f, 5.0f, 0.0f);
        glVertex3f(25.0f, 5.0f, 0.0f);
        glVertex3f(25.0f, 25.0f, 0.0f);
        glEnd();
        glFlush(); 

        // issue the second query
        // records the time when the sequence of OpenGL 
        // commands has been fully executed
        glQueryCounter(queryID[1], GL_TIMESTAMP);
        // wait until the results are available
        GLint stopTimerAvailable = 0;
        while (!stopTimerAvailable) {
            glGetQueryObjectiv(queryID[1],
            GL_QUERY_RESULT_AVAILABLE,
            &stopTimerAvailable);
    }

    // get query results
    glGetQueryObjectui64v(queryID[0], GL_QUERY_RESULT, &startTime);
    glGetQueryObjectui64v(queryID[1], GL_QUERY_RESULT, &stopTime);

    printf("Time spent on the GPU: %f ms\n", (stopTime - startTime) / 1000000.0);

}
void init(void)
{
    /* select clearing color */
    glClearColor(0.5, 0.5, 0.5, 0.0);
    /* initialize viewing values */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 30.0, 0.0, 35.0, -1.0, 1.0);
}
int main(int argc, char** argv)
{

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(600, 600);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("TRIANGLE");
    init();
    const char* version = (const char*)glGetString(GL_VERSION);
    std::cout << version;

    glutDisplayFunc(display);
    glutMainLoop();
    return 0; /* ANSI C requires main to return an int. */
}
glutInitContextVersion (1, 5);
glewExperimental = GL_TRUE;
GLenum err = glewInit();
if (GLEW_OK != err)
{
  /* Problem: glewInit failed, something is seriously wrong. */
  fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
}