C++ 在使用OpenGL绘制大量帧后关闭程序时,GPU的使用率跳到100%

C++ 在使用OpenGL绘制大量帧后关闭程序时,GPU的使用率跳到100%,c++,windows,opengl,glew,C++,Windows,Opengl,Glew,因此,我偶然发现了一件非常奇怪的事情(在经历了一个项目并修复了内存泄漏之后,一旦关闭程序,内存泄漏会导致100%的CPU峰值),这似乎会导致难以置信的短时间的100%GPU使用峰值,同样,一旦关闭程序 下面是我运行的最简单的代码: #未定义UNICODE #包括 #定义GLEW_静态 #包括“包括/GL/glew.h” #包括 #包括 #包括 // //窗口 // HWND window_HWND={}; WNDCLASS窗口_WNDCLASS={}; std::string wndclass

因此,我偶然发现了一件非常奇怪的事情(在经历了一个项目并修复了内存泄漏之后,一旦关闭程序,内存泄漏会导致100%的CPU峰值),这似乎会导致难以置信的短时间的100%GPU使用峰值,同样,一旦关闭程序

下面是我运行的最简单的代码:

#未定义UNICODE
#包括
#定义GLEW_静态
#包括“包括/GL/glew.h”
#包括
#包括
#包括
//
//窗口
//
HWND window_HWND={};
WNDCLASS窗口_WNDCLASS={};
std::string wndclass_name=“class”;
std::string window_name=“class”;
LRESULT回调WindowProc(
_在HWND HWND,
_在uuint uMsg,
_在WPARAM WPARAM,
_In_lparamlparam
)
{
开关(
uMsg
)
{
违约:
返回DefWindowProc(
hWnd,
uMsg,
wParam,
lParam
);
}
返回0;
}
无效窗口\u创建\u类()
{
window_wndclass={};
window_wndclass.lpfnWndProc=WindowProc;
window_wndclass.lpszClassName=wndclass_name.c_str();
window_wndclass.cbClsExtra=0;
window_wndclass.cbWndExtra=0;
window_wndclass.hInstance=0;
注册类(
&窗口类
);
}
无效窗口_创建()
{
窗口创建类();
window\u hwnd=CreateWindow(
wndclass_name.c_str(),
window_name.c_str(),
WS|U重叠| WS|U标题| WS|U系统菜单| WS|U厚框| WS|U最小化框| WS|U最大化框,
CW_使用默认值,
CW_使用默认值,
CW_使用默认值,
CW_使用默认值,
0,
0,
0,
0
);
}
int window_loop()
{
味精;
BOOL获得信息;
当(
(
获取消息=获取消息(
&味精,
窗户,
0,
0
) > 0
) != 0
)
{
如果(
获取消息==-1
)
{
//错误处理
打破
}
其他的
{
翻译信息(
&味精
);
发送消息(
&味精
);
}
}
返回get_消息;
}
//
//opengl
//
HDC gl_HDC={};
HGLRC gl_HGLRC={};
像素格式描述符gl\U像素格式\U描述符={
sizeof(
像素格式描述符
),
1.
//旗帜
PFD|U DRAW|U TO|U窗口| PFD|U支持| OPENGL | PFD|U DOUBLEBUFFER,
//帧缓冲区的类型。RGBA或调色板。
PFD_类型_RGBA,
//帧缓冲区的颜色深度。
32,
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
//深度缓冲区的位数
24,
//模具缓冲区的位数
8.
//帧缓冲区中辅助缓冲区的数量。
0,
PFD_主飞机,
0,
0, 0, 0
};
int gl_像素_格式=-1;
无效gl_像素_格式_配置()
{
gl_像素_格式=选择像素格式(
德国劳埃德大学,
&gl\u像素\u格式\u描述符
);
设置像素格式(
德国劳埃德大学,
gl_像素_格式,
&gl\u像素\u格式\u描述符
);
}
void gl_create()
{
gl_像素_格式_配置();
gl_hglrc=wglCreateContext(
gl_hdc
);
wglMakeCurrent(
德国劳埃德大学,
gl_hglrc
);
GLenum state=glewInit();
如果(
状态!=GLEW_OK
)
{
投掷;
}
}
作废总帐绘图()
{
RECT客户机_RECT={};
GetClientRect(
窗户,
&客户方
);
int window_width=client_rect.right-client_rect.left;
int window_height=client_rect.bottom-client_rect.top;
GLVIEW(
0,
0,
窗宽,
窗高
);
glClearColor(
0.0f,
0.0f,
0.0f,
1.0f
);
glClear(
GL\U颜色\U缓冲\U位
);
wglSwapLayerBuffers(
德国劳埃德大学,
WGL_交换_主平面
);
}
int main()
{
窗口创建();
gl_hdc=GetDC(
窗户
);
gl_create();
橱窗(
窗户,
短剧
);
//模拟绘图框
自动现在=标准::计时::稳定时钟::现在();
自动间隔=标准::计时::持续时间<
双重的
标准::计时::秒::周期
>(
1.0 / 60.0
);
自动下一步=现在+间隔;
为了(
int i=0;
i<400;
我++
)
{
gl_draw();
std::此线程::睡眠\u直到(
下一个
);
下一个+=间隔;
}
返回窗口_循环();
}
在Windows上,使用GLEW库。使用Visual Studio的编译器编译,并进行版本优化。我也在我的笔记本电脑上测试了它,它有一个完全不同的GPU(实际上是英特尔集成图形),具有相同的效果

当未调用
wglSwapLayerBuffers
时,不会发生这种情况

请注意,它甚至不绘制任何东西,甚至不创建任何OpenGL对象,也不在任何地方使用指针。这让我想知道,我使用Windows的OpenGL上下文是否错误?或者这是GLEW的一个特点?(顺便说一句,我假设400个绘制帧的效果(这不是造成这种情况的确切数量,我没有费心精确地确定它,但它不会发生在300个,例如)可能会因GPU而异。尽管将其设置为1000+之类的值肯定会起作用,但这并不是一个不切实际的数字)

老实说,这并不完全是一个问题(毕竟,它发生在
main
返回之后),但它仍然很奇怪,我想避免它。那么,为什么会发生这种情况,或者至少我该如何解决它呢


编辑#1: 我对OpenGL上下文创建进行了更多的尝试,创建了一个适当的上下文,而不是像我提供的示例中那样简单的上下文,但没有成功

好奇心也征服了我,这让我翻阅了我的蒸汽图书馆,开始了十几个游戏,等待一个星期