C++ glBeginQuery GLU内存不足错误
我正在使用glQuery获取有关我的应用程序中FPS计数的信息: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
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;