c++ - 在使用 OpenGL 上下文时调用 SDL_GL_SwapWindow 时如何避免高 GPU 使用率?
问题描述
我遇到了一种奇怪的行为,即 GPU 使用率非常高,有时仅低于 2%。
现在我正在使用 OpenGL 上下文进行绘图调用,您可以在此处查看我用来重现此错误的代码:
#include <GL/glew.h>
#include <SDL2/SDL.h>
#include <string>
static const int DEFAULT_WINDOW_WIDTH = 1280;
static const int DEFAULT_WINDOW_HEIGHT = 720;
int main() {
SDL_Init(SDL_INIT_VIDEO);
#ifdef __APPLE__
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS,
SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
#endif
SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl");
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_Window *window =
SDL_CreateWindow(nullptr, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT,
SDL_WINDOW_OPENGL | SDL_WINDOW_ALLOW_HIGHDPI);
SDL_GLContext glcontext = SDL_GL_CreateContext(window);
glewExperimental = GL_TRUE;
glewInit();
SDL_GL_MakeCurrent(window, glcontext);
SDL_GL_SetSwapInterval(1);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
SDL_Event event;
bool quit = false;
while (!quit) {
while (SDL_PollEvent(&event)) {
quit = SDL_QUIT == event.type;
}
SDL_GL_SwapWindow(window);
}
SDL_GL_DeleteContext(glcontext);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
我将其隔离为仅 SDL_GL_SwapWindow 调用,如果您查看屏幕截图,您会发现它单独占用了 26% 的 GPU 使用量。这是随机的,如果我等待几个小时然后回来,GPU 使用率将在 2% 左右。
我关闭了所有其他应用程序和进程,以检查其他应用程序打开时是否发生这种情况。
我尝试为 GLAD 和 GLFW 切换 GLEW 和 SDL,但仍然得到相同的结果。所有这些都在 macos catalina 10.15.7 中
这是正常的吗?
解决方案
推荐阅读
- sql - SQL Teradata - 比较行值但跳过一些行
- python - 如何使用 Selenium 和 Python 提取下拉菜单的选定选项的文本
- html - Angular 8. 如何在登录页面点击登录按钮,并在下一页的导航栏组件上显示用户名?
- javascript - 如何将我的 POST 请求中的数据保存为变量,以在我的 GET 请求中使用?
- javascript - 为什么 Reactjs 不加载组件内容?
- c# - System.InvalidOperationException:“指定的项目不是列表的元素。”
- php - PHP Xdebug 不在 xampp 上调试
- c++ - 从预制文件制作链表
- kubernetes - 如何让我的 kubernetes 获取我最新的 docker 镜像?
- django - 成功创建/编辑/删除帖子(对象)后,在模板中提醒用户