1

我有一个现代 CPU (AMD FX 4170) 和一个现代 GPU (NVidia GTX 660)。然而,这个简单的程序却设法充分利用了我的一个 CPU 内核。这意味着它使用一个 4.2 GHz 内核在 60 FPS 时什么也画不出来。这个程序有什么问题?

#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;
}
4

2 回答 2

4

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

于 2013-06-15T07:10:47.457 回答
3

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

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

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

此外,在此链接中:建议

SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL,1); 可用于启用 vsync 使其不会占用所有 CPU

于 2013-06-15T06:03:01.803 回答