C++ glBeginQuery GLU内存不足错误

C++ glBeginQuery GLU内存不足错误,c++,opengl,C++,Opengl,我正在使用glQuery获取有关我的应用程序中FPS计数的信息: CollectDataBegin(); /*all drawing operations with OpenGL*/ CollectDataEnd(); 其中: void RenderingInfo::CollectDataBegin() { //FPS begin available = 0; GLenum eError; // UPDATE 1 START if (!bQueryG

我正在使用glQuery获取有关我的应用程序中FPS计数的信息:

CollectDataBegin();

/*all drawing operations with OpenGL*/

CollectDataEnd();
其中:

void RenderingInfo::CollectDataBegin()
{
    //FPS begin
    available = 0;
    GLenum eError;
// UPDATE 1 START
        if (!bQueryGenerated){ 
            glGenQueries(1, queries); 
            bQueryGenerated = true;
        }
// UPDATE 1 END
    //GL_NO_ERROR from glGetError();
    glBeginQuery(GL_TIME_ELAPSED, queries[0]);
    //GL_OUT_OF_MEMORY error from glGetError();
    //FPS end
}

void RenderingInfo::CollectDataEnd()
    {
        //FPS begin
        glEndQuery(GL_TIME_ELAPSED);

        iFramesCount++;

        if (iFramesCount == 20)
        {
            iFramesCount = 0;

            while (!available) {
                glGetQueryObjectiv(queries[0], GL_QUERY_RESULT_AVAILABLE, &available);
            }

            glGetQueryObjectui64v(queries[0], GL_QUERY_RESULT, &timeElapsed);

            float jeb = static_cast<float>(timeElapsed) / std::pow(10, 9);

            xRenderStats.fFPS = static_cast<float>(1.0 / jeb);

                sFPS = std::to_string(xRenderStats.fFPS);
// UPDATE 1 START
                if (bQueryGenerated){
                    glDeleteQueries(1, queries);
                    bQueryGenerated = false;
                }
// UPDATE 1 END
        }
}
我使用Nvidia GeForce GTX760和最新的驱动程序编写并测试了这段代码,没有任何问题。 但在切换到我的集成Intel HD Graphics 4600后,调用
glBeginQuery()
后,我收到了内存不足的
GL\u。有趣的是,我不是在调用
glBeginQuery()
之后立即得到这个错误

我找不到任何与这件事相关的帖子,所以我请求你的帮助来解决这个问题

更新1:
我根据@Ike建议修改了我的代码,但我仍然收到
GL\u OUT\u OF MEMORY
错误。

删除与
glQuery
关联的代码后,我的应用程序不再产生
GL\u OF MEMORY
错误。因为我使用这个函数来计算单帧渲染的时间,所以我用更可靠的方法来代替它:

void RenderingInfo::CollectDataBegin()
{
    //FPS begin
    ctTimeBegin = clock();
    //FPS end
}

void RenderingInfo::CollectDataEnd()
    {
    //FPS begin
    ctTimeEnd = clock();

    dElapsedTime += (static_cast<double>((ctTimeEnd - ctTimeBegin))/CLOCKS_PER_SEC);

    iFramesCount++;

    if (iFramesCount == 20)
    {
        if ((dElapsedTime / iFramesCount) < (1.0 / CLOCKS_PER_SEC)){
            xRenderStats.fFPS = 60.0f;
        }
        else{
            xRenderStats.fFPS = static_cast<float>(iFramesCount / dElapsedTime);
        }

        sFPS = std::to_string(xRenderStats.fFPS);

        dElapsedTime = 0.0;
        iFramesCount = 0;
    }
    //FPS end
}

这不是我为什么收到
GL\u OUT\u OF MEMORY
的问题的答案,但它是为了显示一种可能的解决方法,当有人最终遇到类似问题时。

你是否打电话给
glDeleteQueries
?我看到了
glgenquerys
,但是没有相应的删除,尽管这不应该导致这个问题,因为看起来您整个时间只使用一个查询对象。另一件可能需要检查的事情——确保有效的显示上下文(并与之匹配)。另一件要尝试的事情——您似乎假设
0
的查询ID是一个无效的值,
glgenquerys
将永远不会返回该值。我在文档中没有遇到任何提示glGenQueries无法输出ID为0的内容(除非我忽略了某些内容)。因此,我会检查您是否只调用了一次glGenQueries,并且没有覆盖ID为0的有效查询对象。@Ike:我正在调用类析构函数中的
glDeleteQueries()
,因为我在类生存期中只生成一个查询。我是否应该在
glGetQueryObjectai64v()之后删除并重新创建查询?“确保有效的显示上下文”是什么意思?在执行任何渲染操作之前,我将检查
if(wglGetCurrentContext()!=m_hrc)
并且我调用的语句为true:
wglMakeCurrent(m_hdc,m_hrc)考虑到您使用它的方式,并且在呈现代码之外,它可能不太可能与显示上下文相关。我要检查的一件事是,这里假设“0表示无效”:
如果(查询[0]==0)
--零可能不是一个合适的幻数,在这里假设需要分配的查询ID无效。那里的代码实际上可能试图覆盖一个有效的。@Ike:“我会检查您是否只调用了一次glGenQueries,而没有覆盖ID为0的有效查询对象。”您是对的,我会修改我的代码。它可能对您有用,但您应该知道,您现在正在测量完全不同的内容。您的原始代码是测量GPU时间的。您的新代码正在测量CPU时间。这两个基本上是不相关的。嗯,你在这两种情况下都是对的。现在我正在测量CPU时间,这将对我起作用,因为我在渲染管道开始时调用CollectDataBegin(),在SwapBuffers()调用之后调用CollectDataEnd()(这非常重要,我没有提到这一点,对此我很抱歉)
void RenderingInfo::CollectDataBegin()
{
    //FPS begin
    ctTimeBegin = clock();
    //FPS end
}

void RenderingInfo::CollectDataEnd()
    {
    //FPS begin
    ctTimeEnd = clock();

    dElapsedTime += (static_cast<double>((ctTimeEnd - ctTimeBegin))/CLOCKS_PER_SEC);

    iFramesCount++;

    if (iFramesCount == 20)
    {
        if ((dElapsedTime / iFramesCount) < (1.0 / CLOCKS_PER_SEC)){
            xRenderStats.fFPS = 60.0f;
        }
        else{
            xRenderStats.fFPS = static_cast<float>(iFramesCount / dElapsedTime);
        }

        sFPS = std::to_string(xRenderStats.fFPS);

        dElapsedTime = 0.0;
        iFramesCount = 0;
    }
    //FPS end
}
int iFramesCount =0;
clock_t ctTimeBegin = 0;
clock_t ctTimeEnd = 0;
double dElapsedTime = 0.0;