У меня современный процессор (AMD FX 4170) и современный GPU (NVidia GTX 660). И все же этой простой программе удается полностью использовать одно из ядер моего процессора. Это означает, что он использует одно ядро 4,2 ГГц для рисования ничего такого на 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;
}
Оказывается, что драйверы NVidia реализуют ожидание vsync с занятым циклом, который заставляет SDL_GL_SwapBuffers () использовать 100% CPU. Отключение vsync из панели управления NVidia устраняет эту проблему.
Циклы используют столько вычислительной мощности, сколько могут. Основная проблема может быть расположена в:
int delay = 1000 / 60 - (SDL_GetTicks() - now);
Ваша задержка может быть меньше нуля, так что ваша операция может быть просто бесконечным циклом без ожидания. Вам нужно контролировать значение переменной delay
,
Более того, в этом ссылка на сайт: предлагается
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL,1);
можно использовать для включения vsync, чтобы он не использовал весь процессор