【问题标题】:High CPU usage with SDL + OpenGLSDL + OpenGL 的高 CPU 使用率
【发布时间】:2013-06-15 05:49:23
【问题描述】:

我有一个现代 CPU (AMD FX 4170) 和一个现代 GPU (NVidia GTX 660)。然而,这个简单的程序设法充分利用了我的一个 CPU 内核。这意味着它使用一个 4.2 GHz 内核以 60 FPS 的速度绘制nothing。这个程序有什么问题?

#include <SDL/SDL.h>

int main(int argc, char** argv)
{
    SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
    SDL_SetVideoMode(800, 600, 0, SDL_OPENGL | SDL_RESIZABLE);

    while(true)
    {
        Uint32 now = SDL_GetTicks();
        SDL_GL_SwapBuffers();

        int delay = 1000 / 60 - (SDL_GetTicks() - now);
        if(delay > 0) SDL_Delay(delay);
    }

    return 0;
}

【问题讨论】:

    标签: c++ opengl sdl cpu-usage sdl-opengl


    【解决方案1】:

    事实证明,NVidia 的驱动程序使用繁忙循环等待 vsync,导致 SDL_GL_SwapBuffers() 使用 100 % CPU。从 NVidia 控制面板关闭 vsync 可消除此问题。

    【讨论】:

      【解决方案2】:

      循环使用尽可能多的计算能力。主要问题可能位于:

      int delay = 1000 / 60 - (SDL_GetTicks() - now);
      

      您的延迟时间可能小于零,因此您的操作可能只是一个无限循环而无需等待。你需要控制变量delay的值。

      另外,在这个link:建议

      SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL,1);可以用来开启vsync,这样就不会占用所有的CPU

      【讨论】:

      • 但仅当循环的其余部分需要 1 / 60 秒时才成立?在现代系统上应该不会花那么长时间。
      • @Scintillo,如果该方法花费的时间超过 15 毫秒,就会导致这种情况,你能用 std::cout
      • 确实是 SDL_GL_SwapBuffers();使用那个时间。问题是它为什么这样做?它可能正在等待 vsync,但为什么它会在执行此操作时使用完整的 CPU?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多