glBeginQuery GL_OUT_OF_MEMORY错误

问题描述 投票:-1回答:1

我正在使用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
        }
}

RenderingInfo类的私人成员:

GLuint queries[] = {0};
GLint available = 0;
GLuint64 timeElapsed;
int iFramesCount = 0;
bool bQueryGenerated = false; //UPADTE 1

我用最新的驱动程序使用Nvidia GeForce GTX760编写并测试了这段代码,我没有任何问题。但在切换到我的集成英特尔高清显卡4600后,我在调用GL_OUT_OF_MEMORY之后收到了glBeginQuery()。有趣的是,我没有立即得到这个错误,但在打电话给glBeginQuery()之后。

我无法找到任何与此事有关的帖子,所以我要求你的帮助就是解决这个问题。

更新1:我根据@Ike建议修改了我的代码,但我仍然收到GL_OUT_OF_MEMORY错误。

c++ opengl
1个回答
0
投票

删除与glQuery相关的代码后,我的应用程序不再生成GL_OUT_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
}

私人RenderingInfo成员:

int iFramesCount =0;
clock_t ctTimeBegin = 0;
clock_t ctTimeEnd = 0;
double dElapsedTime = 0.0;

这不是我收到GL_OUT_OF_MEMORY的问题的答案,但它是为了显示一个可能的出路,当有人最终会遇到类似的问题。

© www.soinside.com 2019 - 2024. All rights reserved.