首页 > 解决方案 > 在使用 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 中

这是正常的吗?

标签: c++macosopenglsdlglew

解决方案


推荐阅读