使用SDL + OpenGL的高CPU使用率

High CPU usage with SDL + OpenGL

本文关键字:CPU 使用率 的高 OpenGL SDL 使用      更新时间:2023-10-16

我有一个现代的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;
}

事实证明,NVidia的驱动程序实现等待vsync与一个繁忙循环,导致SDL_GL_SwapBuffers()使用100%的CPU。在NVidia控制面板中关闭垂直同步可消除此问题。

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

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

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

此外,在这个链接中:有人建议

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