我正在使用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
错误。
删除与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
的问题的答案,但它是为了显示一个可能的出路,当有人最终会遇到类似的问题。