我有一个现代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;
}
答案 0 :(得分:3)
事实证明,NVidia的驱动程序实现了等待带有繁忙循环的vsync,导致SDL_GL_SwapBuffers()使用100%CPU。从NVidia控制面板关闭vsync会消除此问题。
答案 1 :(得分:2)
循环使用尽可能多的计算能力。主要问题可能在于:
int delay = 1000 / 60 - (SDL_GetTicks() - now);
您的延迟时间可能小于零,因此您的操作可能只是一个无限循环而无需等待。您需要控制变量delay
的值。
此外,在此link中:建议
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL,1);
可用于启用vsync,以便它不会使用所有CPU